答案解析。
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)