美文网首页
leetcode 037. 解数独

leetcode 037. 解数独

作者: 阳光树林 | 来源:发表于2019-01-14 23:10 被阅读4次

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

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

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

空白格用 '.' 表示。

1.png
一个数独。
2.png
答案被标成红色。
class Solution:
    def solveSudoku(self, board):
        # 由于leetcode题目要求无返回值,所以判断函数用dfs,这里来调用
        self.dfs(board)

    def dfs(self, board):
        # 从头循环来判断每个格子里填什么数字
        for x in range(9):
            for y in range(9):
                if board[x][y] == '.':
                    for nbr in '123456789':
                        board[x][y] = nbr
                        # 如果检测有效且继续向后判断有效返回True,如果False继续用其它数字循环
                        if self.is_valid(board, x, y) and self.dfs(board):
                            return True
                    # 如果没有找到有效的数字恢复值为".",说明数字有问题返回False
                    board[x][y] = '.'
                    return False
        # 所有的"."都填完,返回True
        return True

    def is_valid(self, board, x, y):
        # 判断每行是重复,不含自身
        for col in range(9):
            if board[x][y] == board[x][col] and col != y:
                return False
        # 判断每列是重复,不含自身
        for row in range(9):
            if board[x][y] == board[row][y] and row != x:
                return False
        # 判断每个宫是否重复,不含自身
        x_point = 3 * (x // 3)
        y_point = 3 * (y // 3)
        for x_move in range(3):
            for y_move in range(3):
                x_addr = x_point + x_move
                y_addr = y_point + y_move
                if x != x_addr and y != y_addr and board[x_addr][y_addr] == board[x][y]:
                    return False
        return True


su = Solution()
board = [["5", "3", ".", ".", "7", ".", ".", ".", "."],
         ["6", ".", ".", "1", "9", "5", ".", ".", "."],
         [".", "9", "8", ".", ".", ".", ".", "6", "."],
         ["8", ".", ".", ".", "6", ".", ".", ".", "3"],
         ["4", ".", ".", "8", ".", "3", ".", ".", "1"],
         ["7", ".", ".", ".", "2", ".", ".", ".", "6"],
         [".", "6", ".", ".", ".", ".", "2", "8", "."],
         [".", ".", ".", "4", "1", "9", ".", ".", "5"],
         [".", ".", ".", ".", "8", ".", ".", "7", "9"]]
res = su.solveSudoku(board)
print(board)

相关文章

  • leetcode 037. 解数独

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

  • LeetCode - #37 解数独

    前言 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。微博:@故胤...

  • Python小白 Leetcode刷题历程 No.36-N

    Python小白 Leetcode刷题历程 No.36-No.40 有效的数独、解数独、外观数列、组合...

  • 37. 解数独

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

  • 【LeetCode】37. 解数独

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

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

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

  • 【每日LeetCode】37. 解数独

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

  • Leetcode 精选之搜索( 解数独)

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

  • 解数独

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

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

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

网友评论

      本文标题:leetcode 037. 解数独

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