0
点赞
收藏
分享

微信扫一扫

解数独-回溯37-python

微笑沉默 2022-03-11 阅读 27

答案解析。

class Solution:
    def solveSudoku(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.

        valid:用于当board填完后停止回溯
        space:用于记录board中的空格位置
        row:某数字在某行中是否出现
        column:某数字在某列中是否出现
        square:某数字在某9宫格中是否出现 shape = (3, 3, 9)
        首先遍历board,记录出现的数字/空格的位置
        """
        valid = False
        space = []
        row = [[False] * 9 for _ in range(9)]
        column = [[False] * 9 for _ in range(9)]
        square = [[[False]*9 for _a in range(3)] for _b in range(3)]

        for i in range(9):
            for j in range(9):
                if board[i][j].isdigit():
                    index = int(board[i][j]) - 1
                    row[i][index] = column[j][index] = square[i//3][j//3][index] = True
                else:
                    space.append((i, j))

        def backtrack(pos): 
            nonlocal valid
            if pos == len(space):
                valid = True
                return

            i, j = space[pos]
            for cho in range(9): # 选择空间:9
                if row[i][cho] == column[j][cho] == square[i//3][j//3][cho] == False:
                    # 做选择
                    row[i][cho] = column[j][cho] = square[i//3][j//3][cho] = True 
                    board[i][j] = str(cho+1)
                    backtrack(pos+1)
                    # 撤回选择
                    row[i][cho] = column[j][cho] = square[i//3][j//3][cho] = False
                if valid:
                    return

        backtrack(0)
举报

相关推荐

0 条评论