分治法之棋盤覆蓋

利用分治思想實現一個棋牌覆蓋的簡單程序,以複習分治法的內容。ios

 1 #include<iostream>
 2 #include<cmath>
 3 
 4 using namespace std;
 5 
 6 #define n 4
 7 int tile = 0;
 8 
 9 int board[n][n];
10 
11 void ChessBoardCover(int tr, int tc, int dr, int dc, int size);
12 
13 
14 int main()
15 {
16     int a, b;
17     cout << "Input the position of the special check:" << endl;
18     cin >> a >> b;
19 
20     ChessBoardCover(0,0,a,b,n);
21 
22     cout << "Output the chessboard(0 represents the special one):" << endl;
23     for (int i = 0; i < n; i++)
24     {
25         for (int j = 0; j < n; j++)
26             cout << board[i][j] << " ";
27         cout << endl;
28     }
29     getchar();
30     getchar();
31 }
32 
33 /*
34 tile是一個全局整形變量,用來表示L形骨牌的編號,初始值爲0。
35 tr:棋盤左上角方格的行號;
36 tc:棋盤左上角方格的列號;
37 dr:特殊方格所在的行號;
38 dc:特殊方格所在的列號;
39 size:size = 2^k,棋盤規格爲2^k×2^k
40 */
41 void ChessBoardCover(int tr, int tc, int dr, int dc, int size)
42 {
43     if (size == 1)
44         return;
45     int t = ++tile;  // L型骨牌號
46     int    s = size / 2;  // 分割棋盤
47 
48     // 覆蓋左上角子棋盤
49     if (dr < tr + s && dc < tc + s) // 特殊方格在此棋盤中
50         ChessBoardCover(tr, tc, dr, dc, s);
51     else 
52     {// 此棋盤中無特殊方格
53         board[tr + s - 1][tc + s - 1] = t; // 用 t 號L型骨牌覆蓋右下角
54         ChessBoardCover(tr, tc, tr + s - 1, tc + s - 1, s); // 覆蓋其他方格
55     }
56 
57     // 覆蓋右上角子棋盤
58     if (dr < tr + s && dc >= tc + s) // 特殊方格在此棋盤中
59         ChessBoardCover(tr, tc + s, dr, dc, s);
60     else {// 此棋盤中無特殊方格
61         board[tr + s - 1][tc + s] = t; // 用 t 號L型骨牌覆蓋左下角
62                                        // 覆蓋其他方格
63         ChessBoardCover(tr, tc + s, tr + s - 1, tc + s, s);
64     }
65 
66     // 覆蓋左下角子棋盤
67     if (dr >= tr + s && dc < tc + s) // 特殊方格在此棋盤中
68         ChessBoardCover(tr + s, tc, dr, dc, s);
69     else
70     {
71         // 用 t號L型骨牌覆蓋右上角
72         board[tr + s][tc + s - 1] = t; 
73         
74         // 覆蓋其他方格
75         ChessBoardCover(tr + s, tc, tr + s, tc + s - 1, s);
76     }
77 
78     // 覆蓋右下角子棋盤
79     if (dr >= tr + s && dc >= tc + s) // 特殊方格在此棋盤中
80         ChessBoardCover(tr + s, tc + s, dr, dc, s);
81     else
82     {
83         board[tr + s][tc + s] = t; // 用 t 號L型骨牌覆蓋左上角
84         ChessBoardCover(tr + s, tc + s, tr + s, tc + s, s); // 覆蓋其他方格
85     }
86 }

 

 

 

做者:耑新新,發佈於  博客園spa

轉載請註明出處,歡迎郵件交流:zhuanxinxin@foxmail.comcode

相關文章
相關標籤/搜索