D&C_棋盘覆盖问题
问题描述:
在一2k*2k个方格组成的棋盘中,有一个特殊黑格子,要求用图中四种L形骨牌不重叠地覆盖棋盘
算法思路:
采用分治的思想,将问题化为规模更小的子问题,如图
程序:
在实现算法时,可以设置个4个判断,然后再每个判断里运行4个子函数,下面的实现采用了一点小技巧,即4个"子棋盘"各管各的事,从而减少了累赘的代码量。
1 #include <iostream> 2 #include <cmath> 3 #include <iomanip> 4 5 using namespace std; 6 7 int num = 0; 8 int board[8][8] = {}; 9 10 void chessBoard(int sx, int sy, int px, int py, int k) 11 { 12 if(k == 0) return; 13 int seq = ++num; 14 int sizes = pow(2, k-1); 15 //左上棋盘要干的两件事 16 if(px < sx + sizes && py < sy + sizes) 17 { 18 //黑格在左上棋盘,对左上棋盘而言它要干的事 19 chessBoard(sx, sy, px, py, k-1); 20 }else 21 { 22 //黑格不在左上棋盘,对左上棋盘而言它要干的事 23 board[sx + sizes -1][sy + sizes -1] = seq; 24 chessBoard(sx, sy, sx + sizes -1, sy + sizes -1, k-1); 25 } 26 27 //右上棋盘要干的两件事 28 if(px >= sx + sizes && py < sy + sizes) 29 { 30 chessBoard(sx + sizes, sy, px, py, k-1); 31 }else 32 { 33 board[sx + sizes][sy + sizes -1] = seq; 34 chessBoard(sx + sizes, sy, sx + sizes, sy + sizes -1, k-1); 35 } 36 37 //左下棋盘要干的两件事 38 if(px < sx + sizes && py >= sy + sizes) 39 { 40 chessBoard(sx, sy + sizes, px, py, k-1); 41 }else 42 { 43 board[sx + sizes -1][sy + sizes] = seq; 44 chessBoard(sx, sy + sizes, sx + sizes -1, sy + sizes, k-1); 45 } 46 47 //右下棋盘要干的两件事 48 if(px >= sx + sizes && py >= sy + sizes) 49 { 50 chessBoard(sx + sizes, sy + sizes, px, py, k-1); 51 }else 52 { 53 board[sx + sizes][sy + sizes] = seq; 54 chessBoard(sx + sizes, sy + sizes, sx + sizes, sy + sizes, k-1); 55 } 56 57 } 58 59 int main() 60 { //测试代码
61 chessBoard(0,0,4,5,3); 62 63 for(int i = 0; i < 8; i++) 64 { 65 for(int j = 0; j < 8; j++) 66 { 67 cout<<setw(3)<<board[i][j]; 68 } 69 cout<<endl; 70 } 71 return 0; 72 }

浙公网安备 33010602011771号