棋盘覆盖问题

 在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。


    四各L型骨牌如下图1



                    图1  

棋盘中的特殊方格如图2



        图2

    实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方 格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。以上原理 如图3所示。



       图3

带bug版本的java实现:不知道为什么当size大于4的时候得出的是错误的结果

tr:棋盘左上角方格的行号

tc:棋盘左上角方格的列号

dr:特殊方格所在的行号

dc:特殊方格所在的列号

size:棋盘规格,size*size

 1 public class Chessboard {
 2     
 3     public static int i=0;
 4     public static int size=10;
 5     public static int board[][] = new int[size][size];
 6     
 7     public static void chessBoard(int tr,int tc,int dr,int dc,int size){
 8         if(size==1) return;  //棋盘只有一个格的时候不再覆盖
 9         int s=size/2;         //分割棋盘 
10         int t=++i;
11         
12         //覆盖左上角棋盘
13         if(dr<tr+s&&dc<tc+s)
14             //特殊方格在此棋盘中
15             chessBoard(tr,tc,dr,dc,s);
16         else{//此棋盘中无特殊方格
17             //覆盖右下角
18             board[tr+s-1][tc+s-1]=t;
19             //覆盖其余方格
20             chessBoard(tr,tc,tr+s-1,dc+s-1,s);
21         }
22         
23         //覆盖右上角棋盘
24         if(dr<tr+s&&dc>=tc+s)
25             //特殊方格在此棋盘中
26             chessBoard(tr,tc+s,dr,dc,s);
27         else{//此棋盘中无特殊方格
28             //覆盖左下角
29             board[tr+s-1][tc+s]=t;
30             //覆盖其余方格
31             chessBoard(tr,tc+s,tr+s-1,tc+s,s);
32         }
33         
34         //覆盖左下角棋盘
35         if(dr>=tr+s&&dc<tc+s)
36             //特殊方格在此棋盘中
37             chessBoard(tr+s,tc,dr,dc,s);
38         else{//此棋盘中无特殊方格
39             //覆盖右上角
40             board[tr+s][tc+s-1]=t;
41             //覆盖其余方格
42             chessBoard(tr+s,tc,tr+s,tc+s-1,s);
43         }
44         
45         //覆盖右下角棋盘
46         if(dr>=tr+s&&dc>=tc+s)
47             //特殊方格在此棋盘中
48             chessBoard(tr+s,tc+s,dr,dc,s);
49         else{//此棋盘中无特殊方格
50             //覆盖左上角
51             board[tr+s][tc+s]=t;
52             //覆盖其余方格
53             chessBoard(tr,tc,tr+s,tc+s,s);
54         }
55         
56     }
57     
58     public static void main(String[] args) {
59         chessBoard(0, 0, 2, 2, 4);
60         for(int i=0;i<4;i++)
61             for(int j=0;j<4;j++)
62             {
63                 if(j==0)
64                     System.out.println();
65                 System.out.print(" "+board[i][j]);
66             }
67     }
68 
69 }

 

没法保证chessBoard函数中无特殊方格的子棋盘被正确覆盖。

 

posted @ 2015-01-21 20:46  佚名000  阅读(463)  评论(0)    收藏  举报