/*棋盘覆盖 2^k * 2^k个方格组成的棋盘,其中有一个特殊方格,然后用4种不同形态的L型骨牌覆盖给定的特殊
棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖.
用分治策略:
当k>0时,将2^k * 2^k棋盘分割为4个2^k-1 * 2^k-1子棋盘;
特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格.为了将这3个无特殊方格的子棋盘转化为
特殊棋盘,可以用一个L型骨牌覆盖这3个较小子棋盘的会合处,这3个子棋盘上被L型骨牌覆盖的方格就成为该棋
盘的特殊方格,从而将问题转化为4个较小规模的棋盘覆盖问题.递归地使用这种分割,直至棋盘简化为1*1棋盘.
*/
#include<iostream>
#include<cstdio>
using namespace std;
int tile=0; /*L型骨牌的编号*/
int board[256][256]; /*棋盘*/
/* tr:棋盘左上角方格的行号;
tc:棋盘左上角方格的列号;
dr:特殊方格所在的行号;
dc:特殊方格所在的列号;
size:棋盘规格.
*/
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; /*此子棋中无特殊方格,用t号L型骨牌覆盖右下角*/
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 i,j,n,x,y;
cout<<"Please enter the number of len:";
cin>>n;
do {
cout<<"Please enter location of the special board:";
cin>>x>>y;
}while(x<0 || y<0 || x>n-1 || y>n-1);
chessBoard(0,0,x-1,y-1,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%5d",board[i][j]);
cout<<endl;
}
return 0;
}