通过递归和回溯的方法,从不完全表的每一个空格出发,尝试填入所有可能的数字,并判断是否符合数独的解法要求,最终输出最大的符合要求的完整表。
具体实现可以使用深度优先搜索,同时利用一个二维数组存储已经填入的数字,以免重复填入。代码如下所示:
class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
self.solve(board)
def solve(self, board):
for i in range(9):
for j in range(9):
if board[i][j] == '.':
for c in '123456789':
if self.isValid(board, i, j, c):
board[i][j] = c
if self.solve(board):
return True
board[i][j] = '.'
return False
return True
def isValid(self, board, row, col, c):
for i in range(9):
if board[i][col] != '.' and board[i][col] == c: return False
if board[row][i] != '.' and board[row][i] == c: return False
if board[3 * (row // 3) + i // 3][3 * (col // 3) + i % 3] != '.' and board[3 * (row // 3) + i // 3][3 * (col // 3) + i % 3] == c: return False
return True
其中 isValid 函数用于判断填入的数字是否符合数独的解法要求。
上一篇:不完美排序的列表,但不太远。
下一篇:不完全Cholesky分解非常慢