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 }

 

posted @ 2014-08-15 20:51  hedgehog小子  阅读(156)  评论(0)    收藏  举报