利用分治思想實現一個棋牌覆蓋的簡單程序,以複習分治法的內容。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