问题描述
有一个2 ^ k ∗ 2 ^ k的方格棋盘,恰有一个方格是黑色的,其他为白色。你的任务是用包含3个方格的L型牌覆盖所有白色方格。黑色方格不能被覆盖,且任意一个白色方格不能同时被两个或更多牌覆盖。如图所示为L型牌的4种旋转方式。
输入
输入有多组测试实例,第一行是k(1<=k<=10),第二行是黑色方哥所在的位置坐标(x,y)(0<=x,y<1024)
输出
边长为2^k的方阵,黑色方格的编号为0,所有L型牌从1开始连续编号,数据之间用Tab键隔开。
输入样例
2
0 1
输出样例
1 0
1 1
分析
利用分治的思想将原问题划分为规模较小的子问题进行求解,每次将棋盘分为原来的1/4,黑格必定位于四个小格中的一个,再将有黑格的那一块递归解决,之后构造出一个大黑格,将例外三个无黑格的子盘转化为特殊棋盘,即用一个L型骨牌覆盖这3个棋盘的交汇处。直至棋盘化为1*1规格,此时只需要一块L型骨牌填充即可。
- 如果黑格在左上子盘,递归填充左上子盘;否则填充左上子盘的右下角(交汇处),将右下看做黑格,递归填充左上子盘
- 如果黑格在右上子盘,递归填充右上子盘;否则填充右上子盘的左下角(交汇处),将右下看做黑格,递归填充右上子盘
- 如果黑格在左下子盘,递归填充左下子盘;否则填充左下子盘的右上角(交汇处),将右上看做黑格,递归填充左下子盘
- 如果黑格在右下子盘,递归填充右下子盘;否则填充右下子盘的左上角(交汇处),将左上看做黑格,递归填充右下子盘
#include <iostream>
using namespace std;
int tile = 1;
int board[100][100]; //棋盘,tr,tc为左上行列号,dr,dc为右下行列号
void chessboard(int tr, int tc,