问题背景
在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。四个L型骨牌如下图:
将 2^k x 2^k 的棋盘分成四块 2^(k-1) x 2^(k-1)的子棋盘,特殊方格一定在其中的一个子棋盘中,
如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘。直到这个子棋盘中只有一个方格为止
如果特殊方格不在某一个子棋盘中,将无特殊方格的子棋盘转换为有特殊方格的子棋盘处理方法如下:
问题解决
变量定义如下:
tile L型牌号
tr 左上角棋盘格行数
tc 左上角棋盘格列数
dr 特殊棋盘格行数
dc 特殊棋盘格列数
java代码:
public class ChessBoard {
static int tile = 0;
static int[][] Board = new int[8][8];
static void chessBoard(int tr,int tc,int dr,int dc,int size){
if(size==1)return;
int t=++tile;// L型骨牌编号加一
int s =size/2;//分治
if(dr<tr+s&&dc<tc+s){
chessBoard(tr,tc,dr,dc,s);//如果在左上子棋盘中,递归
}else {
Board[tr+s-1][tc+s-1]=t;//在右下角放上骨牌,转化为相同性质子问题
chessBoard(tr,tc,tr+s-1,tc+s-1,s);
}
if(dc>=tc+s&&dr<tr+s){
chessBoard(tr,tc+s,dr,dc,s);
}else{
Board[tr+s-1][tc+s]=t;
chessBoard(tr,tc+s,tr+s-1,tc+s,s);
}
if (dr >= tr + s && dc < tc + s){
chessBoard(tr+s, tc, dr, dc, s);
} else {
Board[tr + s][tc + s - 1] = t;
chessBoard(tr+s, tc, tr+s, tc+s-1, s);
}
if (dr >= tr + s && dc >= tc + s){
chessBoard(tr+s, tc+s, dr, dc, s);
} else {
Board[tr + s][tc + s] = t;
chessBoard(tr+s, tc+s, tr+s, tc+s, s);
}
}
static void Print(int arr[][]){
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length;j++){
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
public static void main(String[] args){
Print(Board);
System.out.println();
chessBoard(0,0,2,5,8);
Print(Board);
}
}