码迷,mamicode.com
首页 > 其他好文 > 详细

棋盘覆盖问题

时间:2015-01-21 22:02:06      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

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


    四各L型骨牌如下图1

技术分享

                    图1  

棋盘中的特殊方格如图2

技术分享

        图2

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

技术分享

       图3

带bug版本的java实现:

 

 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][dc+s]=t;
52             //覆盖其余方格
53             chessBoard(tr,tc,tr+s,dc+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函数中无特殊方格的子棋盘被正确覆盖。

 

棋盘覆盖问题

标签:

原文地址:http://www.cnblogs.com/eleven24/p/4240015.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!