棋盘覆盖问题

在一个由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\t",board[i][j]);
80             printf("\n");
81         }
82     }
83     return 0;
84 }

 

posted @ 2016-01-17 13:48  lucky_少哖  阅读(175)  评论(0编辑  收藏  举报