《棋盘覆盖算法》(思路)

2,491 阅读3分钟

**   问题描述:**将一个2k×2k单元格的棋盘用四种L型的图形进行完全覆盖(不能覆盖红色格子,不能发生重复覆盖)。

**   思考:**1)如何能够让计算机实现这种算法?

2)棋盘的大小为什么要为2k×2k的单元格大小?任意的大小可以吗?

程序实现:我们先假设一种简单的情况:当棋盘为4×4的规格大小时。(如图)

如果我们现在从棋盘的中间四个开始填充,那么中间四个格子必定有一个不会被填充,那么这个格子是哪个呢?我们通过画图分析,发现这个不会被填充的格子是左上方的那个格子,不然的话,左上方红色格子周围的空白格子就不会被不重复的覆盖完。

(错误填充)

(正确填充)

   我们发现中间四个方格中缺失的那一个所在区域正是红色方格所在区域(是不是所有的棋盘图中间四个方格都遵循这个规律呢?还是说这只是一个巧合?)很明显这是一个规律

   当我们进行多次实验后,发现这种现象并不是一个巧合。当我们填充表格时,先找到它中间的四个方块进行填充,之后根据这四个方块的中心x轴和y轴把整个棋盘分为4个子棋盘,四个子棋盘中始终只有一个被填充的格子,因为有红色方格的那个子棋盘不会再被覆盖,其他三个子棋盘都会被覆盖上一个黄色的格子。当我们将棋盘分开后,分别再填充四个子棋盘的时候,我们会发现其实该子棋盘只是缩小版的原棋盘,我们就可以用同样的方法找棋盘的中心线和中心四个方格进行填充,当最后棋盘变成2×2大小的时候,我们就可以完成棋盘的覆盖。

我们在解决此棋盘问题的时候,将棋盘一分为四,由繁入简的思想是一种很重要的算法思想-----分治算法。(五大常用算法有:1.递归分治;2.动态规划;3.贪心算法;4.回溯法;5.分支限界法)分治算法可以将问题逐步简化,当简化到可以求解问题的时候得到解。我们熟悉的一个分治算法就是二分检索查找算法。

算法复杂度分析:我们定义该算法的时间复杂度为T(n)。当执行一次算法后生成四个更小规模的子问题T(n)=4T(n-1)。根据给定棋盘的大小为2k×2k,每次进行一次算法执行后,棋盘的规模会变小一倍,所以算法复杂度与棋盘大小相关。T(n)=T(k),当k>0时,T(k)=4T(k-1);当k=0时,T(k)=1。综上棋盘整体的复杂度为T(k)=O(4k

我们开篇提出的两个问题都迎刃而解了吧。棋盘问题就是用分治算法解决;为什么要用2的整数次幂作为棋盘的大小呢?是为了分治划分棋盘来解决问题。

写在最后:这是本人进入IT圈写下的第一篇文章,作为初学者,也借鉴了很多前辈的想法和文章然后自己写下来的一篇小文章。如果文章有不合理的地方,恳请大家指正。欢迎大家留言或者私信交流学习心得!