Leetcode面试经典150题-36-有效数独升级版-37.解数独

解法都在代码里,不懂就留言或者私信,比第一题稍微难点

java 复制代码
public static void solveSudoku(char[][] board) {
        /**定义三个二维数组分别代表行、列、桶(每9个格子)*/
        boolean[][] rowExists = new boolean[9][10];
        boolean[][] colExists = new boolean[9][10];
        boolean[][] bucketExists = new boolean[9][10];
        /**根据原始board初始化三个是否存在的二维数组*/
        initArrays(board, rowExists, colExists, bucketExists);
        process(board, rowExists, colExists, bucketExists, 0, 0);
    }

    private static boolean process(char[][] board, boolean[][] rowExists, boolean[][] colExists, boolean[][] bucketExists, int curRow, int curCol) {
        /**我们是按照行从下到上填的,一行填完才填下一行,如果行越界了,说明正常范围内的行都填完了*/
        if(curRow == 9) {
            return true;
        }
        /**如果当前的位置可以填,那下个位置填啥,nextRow和nextCol表示下个要填的位置的行和列*/
        int nextRow = curCol == 8? curRow + 1 : curRow;
        int nextCol = curCol == 8? 0 : curCol + 1;
        /**当前位置填过了就继续填下一个*/
        if(board[curRow][curCol] != '.') {
            return process(board, rowExists, colExists, bucketExists, nextRow, nextCol);
        } else {
            /**当前位置可以填就填,那我们填哪些呢?所有的目前符合的(行列桶都不违规)都可以试试*/
            for(char c = '1'; c <= '9'; c++) {
                int num = c - '0';
                int bucketNum = (curRow/3) * 3 + curCol / 3;
                /**行、列、桶任意一个存在就不能填*/
                if(rowExists[curRow][num] || colExists[curCol][num] || bucketExists[bucketNum][num]) {
                    continue;
                }
                board[curRow][curCol] = c;
                /**填完之后行、列、桶做标记*/
                rowExists[curRow][num] = true;
                colExists[curCol][num] = true;
                bucketExists[bucketNum][num] = true;
                /**如果后面的过程尝试正确就直接返回,否则不处理*/
                if(process(board, rowExists, colExists, bucketExists, nextRow, nextCol)) {
                    return true;
                }
                /**不成功一定要恢复现场*/
                board[curRow][curCol] = '.';
                rowExists[curRow][num] = false;
                colExists[curCol][num] = false;
                bucketExists[bucketNum][num] = false;

            }
        }
        /**如果中间过程都没有返回,返回false*/
        return false;
    }

    /**遍历board初始化是否存在的数组*/
    private static void initArrays(char[][] board, boolean[][] rowExists, boolean[][] colExists, boolean[][] bucketExists) {
        for(int i = 0; i < board.length; i++) {
            for(int j = 0; j < board[i].length; j++) {
                if(board[i][j] == '.') {
                    continue;
                }
                int num = board[i][j] - '0';
                int bucketNum = (i / 3) * 3 + j / 3;
                rowExists[i][num] = true;
                colExists[j][num] = true;
                bucketExists[bucketNum][num] = true;
            }
        }
    }

运行结果:

相关推荐
小林敲代码778814 分钟前
Spring Boot 3 升级踩坑:aj-captcha 行为验证码底图加载失效
java·spring boot·后端
带刺的坐椅39 分钟前
Solon I18n:三种解析器,零样板代码
java·国际化·i18n·solon·多语言
掉鱼的猫1 小时前
Solon I18n:三种解析器,零样板代码
java
程序员阿明1 小时前
spring boot3访问resources下的文件,使得在浏览器url中可以直接访问
java·spring boot·后端
无bug代码搬运工1 小时前
LeetCode 42 接雨水:双指针解法详解
算法·leetcode·职场和发展
wuminyu1 小时前
JUC包的AQS与JVM的ObjectMonitor机制对比分析
java·linux·c语言·jvm·c++
霸道流氓气质1 小时前
SpringBoot中使用OAuth2 认证与 JWT Token — 概念、原理与实践
java·spring boot·后端
dogstarhuang1 小时前
Kimi K3 本地部署实战:从 1.56TB 权重到推理服务的完整成本分析
java·人工智能·后端·ai·开源·接口·程序员创富
就不掉头发2 小时前
C++函数模板
java·开发语言·c++
用户298698530142 小时前
Word 转 PDF 的 3 种自动化实现:从桌面操作到后端服务集成
java·人工智能·后端