蓝桥杯之解数独

这篇博客分享了一个使用Java实现的数独求解器,通过回溯法检查每一格数字是否合法。博客中强调了两个关键点,即判断数字是否在当前行、列和宫格重复的逻辑,以及如何递归填充和回溯。代码详细展示了如何构建和验证数独矩阵,适合初学者理解和学习算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天刚刚敲得代码,刚刚学会的

public class test3 {
    public static int[][] map;
    public static boolean isValid(int[][] map,int row,int col,int num){
        for(int i = 0;i < 9;i++){
            if(map[i][col] == num){
                return false;
            }
            if(map[row][i] == num){
                return false;
            }
            if(map[3*(row/3)+i/3][3*(col/3)+i%3] == num){
                return false;
            }
        }
        return true;
    }
    public static boolean backtracking(int[][] map,int row,int col){
        //以列扫描,当到达最后一列的时候就去下一行
        if(col == map[0].length){
            return backtracking(map,row+1,0);
        }
        //当行数超过棋盘行数的时候,直接return
        if(row == map.length){
            return true;
        }
        //如果出现了已经填了数字的情况下就直接跳过往下算
        if(map[row][col] != 0){
            return backtracking(map,row,col+1);
        }
        //进入回溯法关键部分
        for(int i = 1;i <= 9;i++){
            //如果这个数字可以填进去,那么我们就填入
            if(!isValid(map,row,col,i)){
                continue;
            }
            map[row][col] = i;
            //就是如果按照这个数字填了成功的话,那么就返回true,如果没有说明这个数独这个空不是这个数字
            if(backtracking(map,row,col)){
                return true;
            }
            //如果不是填回原来的数字0
            map[row][col] = 0;
        }
        return false;
    }
    public static void main(String[] args){
        map = new int[][]{{0,0,5,3,0,0,0,0,0},
                                {8,0,0,0,0,0,0,2,0},
                                {0,7,0,0,1,0,5,0,0},
                                {4,0,0,0,0,5,3,0,0},
                                {0,1,0,0,7,0,0,0,6},
                                {0,0,3,2,0,0,0,8,0},
                                {0,6,0,5,0,0,0,0,9},
                                {0,0,4,0,0,0,0,3,0},
                                {0,0,0,0,0,9,7,0,0}};
        backtracking(map,0,0);
        for(int i = 0;i < 9;i++){
            for(int j = 0;j < 9;j++){
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }
}

个人觉得有两个非常重要的地方,用红色字体标注。我觉得这两个地方不是很好想到说实话,这两个地方需要自己仔细的琢磨,不是特别好理解。但是自己画画图也是不难的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值