leetcode 37 数独
判断数字是否填写正确没那么困难,通过check函数。减少时间复杂度,通过传入i,j。
!!!注意然后只返回一个解即可,需要 return。
唯一不同的变化是,题解的回溯函数有一个返回值,它是布尔类型,一旦返回 True,在递归那边就会把 True 传递上去,终止回溯。这一点值得注意。
class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
def check(value,i,j,board1):
for t in range(len(board1)):
if value ==board1[t][j]:
return False
if value == board1[i][t]:
return False
for t in range((i//3)*3,((i//3)+1)*3):
for k in range((j//3)*3,(j//3+1)*3):
if board1[t][k]==value:
if t!=i and k!=j:
return False
return True
def dfs(i,j,board):
if j==9:
return dfs(i+1,0,board)#成功后不往下执行了
if i==9:
return True
if board[i][j]=='.':
for value in range(1,10):
if check(str(value),i,j,board):
board[i][j]=str(value)
if dfs(i,j+1,board):#只返回一个解
return True
board[i][j]='.'
else:
return dfs(i,j+1,board)#成功后不往下执行了
dfs(0,0,board)
也可以先确定可用数字数组。
见https://leetcode-cn.com/problems/sudoku-solver/solution/jing-dian-hui-su-fa-jin-shuang-bai-jie-fa-jian-dan/
查看3道真题和解析