在一个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函数中无特殊方格的子棋盘被正确覆盖。