2015年(33)
分类: C/C++
2015-09-14 13:10:14
棋盘覆盖
(一)原理介绍
在一个2^k * 2^k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为以特殊棋盘。
在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格之外的所有方格,且任何2个L型骨牌不得重叠覆盖。
当k>0时,将2^k * 2^k棋盘分割为4个2^(k-1) * 2^(k - 1)子棋盘,如下图所示。特殊方格必位于4个较小子棋盘之一种,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如下图所示。从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1*1。
为了更加清楚了解这个原理,下面引用:
这里我们用分治法解决该问题。分治法是把一个规模很大的问题分解为多个规模较小的类似的子问题,然后递归地解决所有子问题,最后再由子问题的解决得到原问题的解决。
【解题思路】
将2^k * 2^k的棋盘,先分成相等的四块子棋盘,其中特殊方格位于四个中的一个,构造剩下没特殊方格的三个字棋盘,将它们中的也假设一个方格为特殊方格。如果是:
左上角的子棋盘(若不存在特殊方格):则将该子棋盘右下角的那个方格假设为特殊方格;
右上角的子棋盘(若不存在特殊方格):则将该子棋盘左下角的那个方格假设为特殊方格;
左下角的子棋盘(若不存在特殊方格):则将该子棋盘右上角的那个方格假设为特殊方格;
右下角的子棋盘(若不存在特殊方格):则将该子棋盘左上角的那个方格假设为特殊方格;
当然,上面四种情况,只可能且必定只有三种成立,那三个假设的特殊方格刚好构成一个L型骨牌,我们可以给它们作上相同的标志。这样四个子棋盘就分别都和原来的大棋盘类似,我们就可以用递归的算法解决了。
感谢作者哈。
(二)代码实现
点击(此处)折叠或打开
梦醒潇湘love
2013-03-01 16:27