/*棋盘覆盖 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; }