java實現分治法---棋盤覆蓋問題

/**
 * 分治算法
 *
 * 棋盤覆蓋問題
 *
 *   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);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章