在一个由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 #include2 #include 3 #include 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 =tc+s)33 //特殊方格在此棋盘中34 ChessBoard(tr,tc+s,dr,dc,s);35 else36 {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 =tr+s&&dc>=tc+s)57 //特殊方格在此棋盘中58 ChessBoard(tr+s,tc+s,dr,dc,s);59 else60 {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