/**
* 分治算法
*
* 棋盤覆蓋問題
*
* 2 2 3 3
* 2 1 1 3
* 4 1 0 1
* 4 4 1 1
* */
public class ChessBoradProblem {
private int[][] board; //棋盤
private int specialRow; //特殊點的行下標
private int specialCol; //特殊點的列下標
private int size;
private int type = 0;
public ChessBoradProblem(int specialRow, int specialCol, int size) {
this.specialRow = specialRow;
this.specialCol = specialCol;
this.size = size;
board = new int[size][size];
}
/**
* @param specialRow 特殊點的行下標
* @param specialCol 特殊點的列下標
* @param leftRow 矩陣的左邊起點行下標
* @param leftCol 矩陣的左邊起點列下標
* @param size 矩陣的寬或者高
* */
private void ChessBoard(int specialRow,int specialCol,int leftRow,int leftCol,int size){
if(size == 1){
return;
}
int subSize = size / 2;
type = type % 4 + 1;
int n = type;
//假設特殊點在左上角區域
if(specialRow < leftRow + subSize && specialCol < leftCol + subSize){
ChessBoard(specialRow,specialCol,leftRow,leftCol,subSize);
}else{
//不在左上角,左上角矩陣的右下角就是特殊點
board[leftRow + subSize - 1][leftCol + subSize - 1] = n;
ChessBoard(leftRow + subSize - 1,leftCol + subSize - 1,leftRow,leftCol,subSize);
}
//假設特殊點在右上方
if(specialRow < leftRow + subSize && specialCol >= leftCol + subSize){
ChessBoard(specialRow,specialCol,leftRow,leftCol + subSize,subSize);
}else{
//不在右上方,右上角矩陣的左下角就是特殊點
board[leftRow + subSize - 1][leftCol + subSize] = n;
ChessBoard(leftRow + subSize - 1,leftCol + subSize,leftRow,leftCol,subSize);
}
//特殊點在左下方
if(specialRow >= leftRow + subSize && specialCol < leftCol + subSize){
ChessBoard(specialRow,specialCol,leftRow + subSize,leftCol,subSize);
}else{
board[leftRow + subSize][leftCol + subSize - 1] = n;
ChessBoard(leftRow + subSize,leftCol + subSize - 1,leftRow,leftCol,subSize);
}
//特殊點在右下角
if(specialRow >= leftRow + subSize && specialCol >= leftCol + subSize){
ChessBoard(specialRow,specialCol,leftRow + subSize,leftCol + subSize,subSize);
}else{
board[leftRow + subSize][leftCol + subSize] = n;
ChessBoard(leftRow + subSize,leftCol + subSize,leftRow,leftCol,subSize);
}
for(int i = 0;i < size;i++){
for(int j = 0;j < size;j++){
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args){
ChessBoradProblem c = new ChessBoradProblem(0,1,2);
c.ChessBoard(0,1,0,0,2);
}
}