编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。
一个数独。
答案被标成红色。
Note:
给定的数独序列只包含数字 1-9 和字符 '.' 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
rowuse = [[False]*10 for i in range(9)]
coluse = [[False]*10 for i in range(9)]
cubeuse = [[False]*10 for i in range(9)]
for i in range(9):
for j in range(9):
if board[i][j] != '.':
rowuse[i][int(board[i][j])] = True
coluse[j][int(board[i][j])] = True
cubeuse[i//3*3+j//3][int(board[i][j])] = True
self.back(board, 0, 0, rowuse, coluse, cubeuse)
def back(self, board, row, col, rowuse, coluse, cubeuse):
if col == 9:
row += 1
col = 0
if row == 9:
return True
if board[row][col] == '.':
for i in range(1,10):
if not rowuse[row][i] and not coluse[col][i] and not cubeuse[row//3*3+col//3][i]:
board[row][col] = str(i)
rowuse[row][i] = True
coluse[col][i] = True
cubeuse[row//3*3+col//3][i] = True
if self.back(board, row, col+1, rowuse, coluse, cubeuse):
return True
board[row][col] = '.'
rowuse[row][i] = False
coluse[col][i] = False
cubeuse[row//3*3+col//3][i] = False
else:
return self.back(board, row, col+1, rowuse, coluse, cubeuse)
return False