在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。
问题: 用4种不同形态的L型骨牌, 覆盖给定特殊棋盘上除特殊方格以外的所有方格,且任何2个不得重叠。
example:
input:
2
0 1
output:
1'\t'0
1'\t'1
可采用分治法,切成4均分之后补全其余3个没有特殊grid的地方从而继续覆盖4个小问题。
书上参考代码如下:
#include<iostream>
using namespace std;
int tile=1;
int Board[100][100];
void ChessBoard(int tr,int tc,int dr,int dc,int size)
{
if(size==1) return;
int t=tile++,s=size/2;
if(dr<tr+s && dc<tc+s)
ChessBoard(tr,tc,dr,dc,s);
else{
Board[tr+s-1][tc+s-1] = t;
ChessBoard(tr,tc,tr+s-1,tc+s-1,s);
}
if(dr<tr+s && dc>=tc+s)
ChessBoard(tr,tc+s,dr,dc,s);
else{
Board[tr+s-1][tc+s] = t;
ChessBoard(tr,tc+s,tr+s-1,tc+s,s);
}
if(dr>=tr+s && dc<tc+s)
ChessBoard(tr+s,tc,dr,dc,s);
else{
Board[tr+s][tc+s-1] = t;
ChessBoard(tr+s,tc,tr+s,tc+s-1,s);
}
if(dr>=tr+s && dc>=tc+s)
ChessBoard(tr+s,tc+s,dr,dc,s);
else{
Board[tr+s][tc+s] = t;
ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}
int main()
{
int size; cin>>size;
int a,b; cin>>a>>b;
ChessBoard(0,0,a,b,size);
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
{
cout<<Board[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}