美文网首页
【LeetCode】37. 解数独

【LeetCode】37. 解数独

作者: testtest | 来源:发表于2021-12-11 11:56 被阅读0次

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则:

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sudoku-solver
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:每个需要填写数字的位置,可以填数字1-9,但是行和列都不能有重复,这是一个限制条件,
暴力求解,只要是符合的数就填
class Solution {

    /**
    
    每个需要填写数字的位置,可以填数字1-9,但是行和列都不能有重复,这是一个限制条件,
    暴力求解,只要是符合的数就填
     */
    public void solveSudoku(char[][] board) {
        dfs(board,0,0);

    }

    private boolean dfs(char[][] board, int row, int col) {


        if(row == board.length-1 && col == board.length) {
            return true;
        }
        if(col == board.length) {
            row++;
            col = 0;
        }
        if(board[row][col] != '.') {
            return dfs(board, row, col+1);
           
        } else {
            for(int j=1;j<=9;j++) {
                //赋值。
                char c = (char)('0' + j);
                if(isExist(board, row, col, c)) {
                    continue;
                }
                board[row][col] = c;
                boolean ret =  dfs(board, row, col + 1);
                
                if(ret) {
                    return true;
                }
                // 如果返回false, 说明之后的不成功,则说明该值不行,重新赋值
                board[row][col] = '.';
            }
            return false;
        }
        
    }

    private boolean isExist(char[][] board, int row, int col, char target) {

        for(int i=0;i<board.length;i++) {
            if(board[row][i] == target) {
                return true;
            }
        }
        for(int i=0;i<board.length;i++) {
            if(board[i][col] == target) {
                return true;
            }
        }

        int p = row/3;
        int q = col/3;
        for(int i=3*p ; i<3*p +3;i++) {
            for(int j=3*q;j<3*q+3;j++) {
                if(board[i][j] == target) {
                    return true;
                }
            }
        }

        return false;

    }
}

相关文章

  • 37. 解数独

    37. 解数独(难度:困难) 题目链接:https://leetcode-cn.com/problems/sudo...

  • 【LeetCode】37. 解数独

    编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字...

  • 回溯算法最佳实践:解数独

    读完本文,你可以去力扣拿下如下题目: 37.解数独[https://leetcode-cn.com/problem...

  • 【每日LeetCode】37. 解数独

    题目 编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出...

  • Leetcode 37. 解数独(回溯算法)

    题目描述: 编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:1、数字 1-9 在每一行...

  • leetcode 37. 解数独(Java版)

    题目描述(题目难度,困难) 编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 ...

  • LeetCode 37. 解数独(Sudoku Solver)

    37. 解数独 编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每...

  • 37. 解数独

    自己解法 这个题因为刚做完上个题,知道要判断行、列和子九宫格不能有重复的元素,因为空白格只能一个一个去试,所以也能...

  • 37. 解数独

    编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数...

  • 37. 解数独

    题目编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现...

网友评论

      本文标题:【LeetCode】37. 解数独

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