4.10 棋盘覆盖问题
棋盘覆盖问题
问题描述
棋盘覆盖问题。有一个$2^k∗2^k$的方格棋盘,恰有一个方格是黑色的,其他为白色。你的任务是用包含3个方格的L型牌覆盖所有白色方格。黑色方格不能被覆盖,且任意一个白色方格不能同时被两个或更多牌覆盖。如图所示为L型牌的4种旋转方式。
求解棋盘覆盖的方法。

问题分析
- 问题分类:
策略选择
- 数据结构:线性数据结构
- 算法思想:分治法
算法设计
分治三步骤
- 划分问题:将$2^k∗2^k$的棋盘划分为 $2^{k−1}∗2^{k−1}$这样的子棋盘4块。
- 递归求解:递归填充各个格子,填充分为四个情况,在下面会有解释,递归出口为 k=0k=0也就是子棋盘方格数为1。
- 合并问题:不需要合并子问题。
分治方法:将棋盘等分为四块。然后分为以下两种情况。
- 额外的方格在某一块中,不需要处理该区块。
- 额外的方格不在某一块中。则添加一个L型牌覆盖三个没有额外方格的块。
重复以上步骤直到能完全覆盖。
算法分析
算法实现
1 | void chessBoard(int row, int column, int x, int y, int siz) { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Estom的博客!









