问题描述
class Solution:
def solveSudoku(self,board: List[List[str]]) -> None:
"""
Do not return anything,modify board in-place instead.
"""
def is_correct(row,col,num):
#column
for c in range(9):
if board[row][c] == num:
return False
#row
for r in range(9):
if board[r][col] == num:
return False
#square
x = row//3 * 3
y = col//3 * 3
for i in range(3):
for j in range(3):
if board[x+i][y+j] == num:
return False
return True
def find_next():
for i in range(9):
for j in range(9):
if board[i][j] == '.':
return i,j
return None,None
def solve():
row,col = find_next()
if row == None:
print(board)
return True
for i in range(1,10):
if is_correct(row,str(i)):
board[row][col] = str(i)
solve()
board[row][col] = '.'
solve()
print
函数中的solve
函数返回已解决的数独板,但未就位进行更改。如何更改功能,以便在原位更改板子?
解决方法
找到解决方案后,在调用堆栈中返回True
。
尝试以下代码:
board = [
["5","3",".","7","."],["6","1","9","5",[".","8","6",["8","3"],["4","1"],["7","2","6"],"4","5"],"9"]]
class Solution:
def solveSudoku(self,board) -> None:
"""
Do not return anything,modify board in-place instead.
"""
solve()
def is_correct(row,col,num):
#column
for c in range(9):
if board[row][c] == num:
return False
#row
for r in range(9):
if board[r][col] == num:
return False
#square
x = row//3 * 3
y = col//3 * 3
for i in range(3):
for j in range(3):
if board[x+i][y+j] == num:
return False
return True
def find_next():
for i in range(9):
for j in range(9):
if board[i][j] == '.':
return i,j
return None,None
def solve():
#print(id(board))
row,col = find_next()
if row == None:
#print(board)
return True
for i in range(1,10):
if is_correct(row,str(i)):
board[row][col] = str(i)
if solve(): return True # solution found
board[row][col] = '.' # no solution yet
Solution().solveSudoku(board)
print(board) # global board
输出
[['5','3','4','6','7','8','9','1','2'],['6','2','5','8'],['1','7'],['8','3'],['4','1'],['7','6'],['9','4'],['2','5'],['3','9']]