棋盘覆盖问题

 1 #include <iostream>
 2 using namespace std;
 3 const int N = 11;
 4 int Board[N][N];
 5 int tile = 0;
 6  
 7 /*
 8 tr:棋盘左上角方格的行号
 9 tc:棋盘左上角方格的列号
10 dr:特殊方格所在的行号
11 dc:特殊方格所在的列号
12 size:方形棋盘的边长
13 */
14 void ChessBoard(int tr, int tc, int dr, int dc, int size)
15 {
16     if(size == 1)
17         return;
18     int t = ++tile, s = size/2;
19  
20     //覆盖左上角子棋盘
21     if(dr<tr+s && dc<tc+s)
22         //特殊方格在此棋盘中
23         ChessBoard(tr, tc, dr, dc, s);
24     else   // 此棋盘无特殊方格
25     {
26         // 用t号L型骨型牌覆盖右下角
27         Board[tr+s-1][tc+s-1] = t;
28         // 覆盖其余方格
29         ChessBoard(tr, tc, tr+s-1, tc+s-1, s);
30     }
31  
32     //覆盖右上角子棋盘
33     if(dr<tr+s && dc>=tc+s)
34         ChessBoard(tr, tc+s, dr, dc, s);
35     else
36     {
37         Board[tr+s-1][tc+s] = t;
38         ChessBoard(tr, tc+s, tr+s-1, tc+s, s);
39     }
40  
41     //覆盖左下角子棋盘
42     if(dr>=tr+s && dc<tc+s)
43         ChessBoard(tr+s, tc, dr, dc, s);
44     else
45     {
46         Board[tr+s][tc+s-1] = t;
47         ChessBoard(tr+s, tc, tr+s, tc+s-1, s);
48     }
49  
50     //覆盖右下角子棋盘
51     if(dr>=tr+s && dc>=tc+s)
52         ChessBoard(tr+s, tc+s, dr, dc, s);
53     else
54     {
55         Board[tr+s][tc+s] = t;
56         ChessBoard(tr+s, tc+s, tr+s, tc+s, s);
57     }
58 }
59  
60 void DisplayBoard(int size)
61 {
62     for(int i=1; i<=size; ++i)
63     {
64         for(int j=1; j<=size; ++j)
65             printf("%2d ", Board[i][j]);
66         printf("\n");
67     }
68 }
69  
70 int main()
71 {
72     ChessBoard(1, 1, 1, 2, 4);
73     DisplayBoard(4);
74     return 0;
75 }

 

posted @ 2013-04-05 20:27  萧凡客  阅读(262)  评论(0编辑  收藏  举报