美文网首页计算机
Leetcode - Sudoku Solver

Leetcode - Sudoku Solver

作者: Richardo92 | 来源:发表于2016-09-23 08:02 被阅读30次

My code:

public class Solution {
    public void solveSudoku(char[][] board) {
        if (board == null || board.length == 0 || board[0].length == 0) {
            return;
        }
        
        solve(board);
    }
    
    private boolean solve(char[][] board) {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                char curr = board[i][j];
                if (curr == '.') {
                    for (char k = '1'; k <= '9'; k++) {
                        if (isValid(board, k, i, j)) {
                            board[i][j] = k;
                            if (solve(board)) {
                                return true;
                            }
                            board[i][j] = '.';
                        }
                    }  
                    return false;
                }
            }
        }
        return true;
    }
    
    private boolean isValid(char[][] board, char fill, int row, int col) {
        for (int j = 0; j < 9; j++) {
            if (board[row][j] == fill) {
                return false;
            }
        }
        
        for (int i = 0; i < 9; i++) {
            if (board[i][col] == fill) {
                return false;
            }
        }
        
        for (int i = (row / 3) * 3; i < (row / 3) * 3 + 3; i++) {
            for (int j = (col / 3) * 3; j < (col / 3) * 3 + 3; j++) {
                if (board[i][j] == fill) {
                    return false;
                }
            }
        }
        
        return true;
    }
    
}

reference:
https://discuss.leetcode.com/topic/11327/straight-forward-java-solution-using-backtracking/2

暴力解法。复杂度应该很高很高。
对于 '.' 尝试 1-9 九种填法,看 sudo 是否有效。
如果无效,直接返回false
此处剪枝。
isValid 函数写的也比较高效。因为我只用判断这个点加入后,是否会使得sudoku变得无效。
所以只用判断他所在的行,所在的列,所在的九宫格,就行了。

Anyway, Good luck, Richardo! -- 09/22/2016

相关文章

网友评论

  • DrunkPian0:这种写法的dfs部分没有终止条件,无法理解后面的return false和return true。。
    Richardo92:如果最后这个数独填出来了,那么所有的格子里都会有一个数字,没有一个是 '.'
    所以两层for 循环会全部跑完而不退出,直到跑到最后一行 return true. 这就是 dfs 成功的终止条件。
    如果无解,那么应该是 在某个格子 (i, j) 上,把 k = 1 到 9 都试验了一遍,发现都不行。
    于是return false

本文标题:Leetcode - Sudoku Solver

本文链接:https://www.haomeiwen.com/subject/csktyttx.html