在一个由2^k*2^k个方格组成的棋盘中,若恰有一个方格与其他方格不同,称该方格为特殊方格,且称该棋盘为特殊棋盘。
输入
输入有多组测试例。
对每一个测试例有两行,第一行是k(1<=k<=10),第二行是特殊方格所在的位置坐标x,y(0<=x,y<1024)。
输出
边长为2^k的方阵,特殊方格的编号为0,所有L形骨牌从1开始连续编号,数据之间的间隔是Tab。
输入样例
2
0 1
输出样例
2 0 3 3
2 2 1 3
4 1 1 5
4 4 5 5
附上代码:
1 #include <iostream> 2 #include <cmath> 3 #include <cstdio> 4 using namespace std; 5 6 int board[1025][1025]; //棋盘 7 static int tile=1; //所有L形骨牌从1开始连续编号 8 9 //形参(tr,tc)是棋盘中左上角的方格坐标 10 //形参(dr,dc)是特殊方格所在的坐标 11 //形参size是棋盘的行数或列数 12 void ChessBoard(int tr,int tc,int dr,int dc,int size) 13 { 14 if(size==1) return; //递归边界 15 16 int t=tile++; //L形骨牌牌号 17 int s=size/2; //分割棋盘 18 19 //覆盖左上角子棋盘 20 if(dr<tr+s&&dc<tc+s) 21 //特殊方格在此棋盘中 22 ChessBoard(tr,tc,dr,dc,s); 23 else 24 { 25 //此棋盘中无特殊方格,用t号L形骨牌覆盖右下角 26 board[tr+s-1][tc+s-1]=t; 27 //覆盖其余方格 28 ChessBoard(tr,tc,tr+s-1,tc+s-1,s); 29 } 30 31 //覆盖右上角子棋盘 32 if(dr<tr+s&&dc>=tc+s) 33 //特殊方格在此棋盘中 34 ChessBoard(tr,tc+s,dr,dc,s); 35 else 36 { 37 //此棋盘中无特殊方格,用t号L形骨牌覆盖左下角 38 board[tr+s-1][tc+s]=t; 39 //覆盖其余方格 40 ChessBoard(tr,tc+s,tr+s-1,tc+s,s); 41 } 42 43 //覆盖左下角子棋盘 44 if(dr>=tr+s&&dc<tc+s) 45 //特殊方格在此棋盘中 46 ChessBoard(tr+s,tc,dr,dc,s); 47 else 48 { 49 //此棋盘中无特殊方格,用t号L形骨牌覆盖右上角 50 board[tr+s][tc+s-1]=t; 51 //覆盖其余方格 52 ChessBoard(tr+s,tc,tr+s,tc+s-1,s); 53 } 54 55 //覆盖右下角子棋盘 56 if(dr>=tr+s&&dc>=tc+s) 57 //特殊方格在此棋盘中 58 ChessBoard(tr+s,tc+s,dr,dc,s); 59 else 60 { 61 //此棋盘中无特殊方格,用t号L形骨牌覆盖左上角 62 board[tr+s][tc+s]=t; 63 //覆盖其余方格 64 ChessBoard(tr+s,tc+s,tr+s,tc+s,s); 65 } 66 } 67 68 int main() 69 { 70 int k,i,j,x,y; 71 while(~scanf("%d",&k)) 72 { 73 scanf("%d%d",&x,&y); 74 k=pow(2,k); 75 ChessBoard(0,0,x,y,k); 76 for(i=0; i<k; i++) 77 { 78 for(j=0; j<k; j++) 79 printf("%d ",board[i][j]); 80 printf(" "); 81 } 82 } 83 return 0; 84 }