`

Leetcode - Sudoku Solver

 
阅读更多
[分析] 做Valid Sudoku时表示3*3区块的下标想得很纠结,其实动手把81个格子的坐标都写出来,左上角为(0,0),这个过程中就能发现坐标规律,越勤奋会越聪明~  这道题目虽然被判为Hard,但看到答案后其实并不难,回溯的题目是有模式可循的,虽然我现在还不是很熟练,但多加练习一定能掌握。早上看到一大神的话,能5天刷一遍leetcode时再问咋还不熟呢,与大家共勉~ 另看参考Code_Ganker的解法:http://blog.csdn.net/linhuanmars/article/details/20748761

public class Solution {
    boolean[][] rows = new boolean[9][9];
    boolean[][] cols = new boolean[9][9];
    boolean[][] blocks = new boolean[9][9];
    public void solveSudoku(char[][] board) {
        clean();
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') {
                    int digitIdx = board[i][j] - '1';
                    rows[i][digitIdx] = true;
                    cols[j][digitIdx] = true;
                    blocks[i / 3 * 3 + j / 3][digitIdx] = true;
                }
            }
        }
        solve(board, 0);
    }
    private boolean solve(char[][] board, int idx) {
        while (idx < 81 && board[idx / 9][idx % 9] != '.')
            idx++;
        if (idx == 81)
            return true;
        int row = idx / 9, col = idx % 9, blockId = row / 3 * 3 + col / 3;
        for (int i = 0; i < 9; i++) {
            if (rows[row][i] || cols[col][i] || blocks[blockId][i])
                continue;
            board[row][col] = (char)('1' + i);
            rows[row][i] = cols[col][i] = blocks[blockId][i] = true;
            if (solve(board, idx + 1))
                return true;
            board[row][col] = '.';
            rows[row][i] = cols[col][i] = blocks[blockId][i] = false;
        }
        return false;
    }
    private void clean() {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                rows[i][j] = false;
                cols[i][j] = false;
                blocks[i][j] = false;
            }
        }
    }
}
分享到:
评论

相关推荐

    js-leetcode题解之37-sudoku-solver.js

    js js_leetcode题解之37-sudoku-solver.js

    數位之和leetcode-leetcode-cpp:我的LeetCodeC++答案

    数位之和leetcode LeetCode-cpp ...solver: 37 排序 - merge sort - quick sort - insertion sort - selection sort - counting sort 位操作 - find the only element which exists once/twice... - count

    _leetcode-python.pdf

    - Sudoku Solver: 解数独问题,即给出一个部分填充的数独,要求填充剩余空格。 - Count and Say: 第n个数是“1”,“21”,“1211”,“111221”等描述的下一个数。 - Combination Sum: 找出所有相加之和为特定值的...

    leetcode答案-SudokuSolver:使用计算机视觉和回溯解决数独

    leetcode 答案使用计算机视觉和回溯的数独求解器 安装 存储库可以克隆或下载为 zip。 按照说明安装tesseract 其他需求可以通过运行pip install -r requirements.txt来安装 用法 执行代码如下: python main . py '...

    dna匹配leetcode-leetcode:leetcode刷题

    Solver 深度优先遍历 回溯 先检查后修改 Group Anagrams 排序 unordered_map Minimum Window Substring 两个指针遍历 map Maximal Rectangle 栈 局部递增 或者 动态规划 Binary Tree Inorder Traversal 栈 递归 ...

    LeetCode:关于LeetCode.com和ACM的一些算法问题

    Sudoku Solver题目: | 源码:标签:dfs,数独难度:困难 / Hard82. Remove Duplicates from Sorted List II题目: | 源码:标签:单向链表难度:中等 / Medium146. LRU Cache题目: | 源码:标签:哈希表,双向...

    leetcode_solutions:Leetcode问题的解决方案

    - 最后挑战难题,如“Sudoku Solver”和“Kth Smallest Element in a Sorted Matrix”,锻炼算法设计和复杂问题解决能力。 6. **资源利用** - 通过阅读他人的解决方案,可以学习不同的解题思路和优化技巧。 - ...

    Leetcode部分解答(126题)

    9. **Sudoku Solver.cpp** - 第36题“数独求解器”,解冑会利用回溯法来填充值,确保每一行、每一列和每一个宫格内的数字都符合数独规则。 10. **Subsets II .cpp** - 第90题“子集II”,要求找到一个集合的所有不...

    javascript-leetcode面试题解递归与回溯问题之第37题解数独-题解.zip

    第37题,即“解数独”(Sudoku Solver),是这类问题的一个经典实例,它要求我们用这两种方法来解决实际问题。在这个题解中,我们将详细探讨递归和回溯的概念,并结合解数独的具体步骤进行讲解。 首先,让我们了解...

    C语言基础-C语言编程基础之Leetcode编程题解之第37题解数独.zip

    在本压缩包文件中,我们聚焦于C语言基础,并通过解决LeetCode编程挑战中的第37题——"Sudoku Solver"(数独求解器)来深入理解和实践C语言编程技巧。LeetCode是一个广泛使用的在线平台,它提供了一系列编程题目,...

    2、DFS、回溯、分治法必练题(含答案).pdf

    * Sudoku Solver:该题目要求解决数独问题,即填充一个9x9的数独矩阵,使得每行、每列、每个小矩阵中的数字唯一。解决该题目需要使用回溯算法,递归地探索所有可能的填充方式,然后逐步回溯,直到找到最优解。 分治...

Global site tag (gtag.js) - Google Analytics