题目描述:编写一个程序,通过填充空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
解题思路:思路和N皇后问题是一样的,只是在找到正确答案之后就要停止递归和回溯,此外每个3*3的block的访问下标需要正确计算,代码如下:
class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
rows = [[False]*9 for _ in range(9)]
cols = [[False]*9 for _ in range(9)]
blocks = [[False]*9 for _ in range(9)]
for i in range(9):
for j in range(9):
if board[i][j] != '.':
num = int(board[i][j])-1
rows[i][num] = True
cols[j][num] = True
idx = i // 3 * 3 + j // 3
# print(idx, num)
blocks[idx][num] = True
flag = False
# print(blocks)
def traceback(x, y):
nonlocal flag
if x >= 9:
y += 1
x = 0
if y >= 9:
flag = True
return
# print(x, y)
if board[y][x] != '.':
traceback(x+1, y)
return
idx = x//3+y//3*3
for i in range(9):
if not rows[y][i] and not cols[x][i] and not blocks[idx][i]:
board[y][x] = str(i+1)
rows[y][i] = True
cols[x][i] = True
blocks[idx][i] = True
traceback(x+1, y)
if flag:
return
rows[y][i] = False
cols[x][i] = False
blocks[idx][i] = False
board[y][x] = '.'
traceback(0, 0)