1-24 缺角棋盘的覆盖算法 1 | CoverMissingConnerBoard Recursion Algorithm Primary
考察缺失右上角(面积为4n-1)的2n * 2n 的棋盘 (n>=1)
1. 证明,使用由三个1*1 L型正方形一定可以覆盖该类棋盘。
令 n 为该类棋盘的边长的阶次,我们不妨从最简单的情况入手,也即是
n == 1 的棋盘
显然一定是可以覆盖的
n>1 的棋盘
我们可以转换一下,使用递归的方向进行思考,即不妨所有 n < N 的棋盘都可以被L型棋盘覆盖,我们来考察n == N 的棋盘。
我们不妨将一块L型积木放到中心,缺口方向与棋盘方向保持一致
我们观察左右上下四块,是不是变成了 4 块 n-1 阶次的棋盘。由归纳假设,命题的证。
2. 试用算法解决该问题
我们尝试首先归纳出递归解法
- 如果 n == 1答案显然
- 如果 n != 则摆放一块L型木块在中间,问题变成两个 n-1问题,递归
// cover 算法
void cover(int n,int x,int y,int dx,int dy){
// 子问题的阶次
int s = 1 << (n-1);
// 在中心放置一块缺口朝棋盘缺口的L型
place(x + dx*(s-1),y + dy*(s-1),dx,dy);
// 在问题 > 1 时
if (1 < n){
// 正向缺口方向覆盖
cover(n-1,x,y,dx,dy);
// 逆向缺口方向覆盖
cover(n-1,x + dx