分治学习之棋盘覆盖问题(java)

本文详细探讨了使用分治策略来解决棋盘覆盖问题的方法,通过Java编程语言实现。通过对问题进行分解,递归地解决子问题,最后将结果合并,达到解决问题的目的。文章深入浅出地解释了算法思路,并提供了清晰的代码示例。
package FZ;
/*
2 0 3 3
2 2 1 3
4 1 1 1
4 4 1 1
棋盘一个特殊点用L型的棋子进行覆盖
//进行分治法计算 然后分成更小的 比如4分成2,2,2,2 的矩阵 然后进行继续分 分成1,1,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;
        this.board=new int[size][size];
    }
    /*
        board棋盘
        specialRow特殊行
        specialCol特殊的列
        leftRow矩阵最左边的行
        leftCol矩阵最左边的列
        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, 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+subsize, 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+subsize, leftCol+subsize, subsize);
        }
    }
    public void prentfBoard(){
        ChessBoard(specialRow,specialCol,0,0,size);
        for (int i = 0; i <board.length ; i++) {
            for (int j = 0; j <board.length ; j++) {
                System.out.print(board[i][j]+" ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        int specialRow=0;
        int specialCol=1;
        int n=4;
        ChessBoradProblem a=new ChessBoradProblem(specialRow,specialCol,n);
       a.prentfBoard();
    }
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值