编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.'
表示。
示例 1:
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:
提示:
board.length == 9
board[i].length == 9
board[i][j]
是一位数字或者'.'
- 题目数据 保证 输入数独仅有一个解
解析:
可以定义一个回溯法求解数独问题的算法,通过回溯法来填充数独中的空白位置。
class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
def is_valid(row, col, num):
# 检查同一行、同一列和同一3x3宫内是否存在重复数字
for i in range(9):
if board[row][i] == num or board[i][col] == num or board[row // 3 * 3 + i // 3][col // 3 * 3 + i % 3] == num:
return False
return True
def backtrack():
for row in range(9):
for col in range(9):
if board[row][col] == '.':
for num in map(str, range(1, 10)):
if is_valid(row, col, num):
board[row][col] = num
if backtrack():
return True
board[row][col] = '.'
return False
return True
backtrack()
代码具体实现分析:
- 定义了一个Solution类,其中包含了solveSudoku方法,该方法接收一个二维列表board作为参数,表示数独的初始状态,返回值为None。
- 在solveSudoku方法内部定义了两个函数is_valid和backtrack,is_valid用于检查在给定位置(row, col)填入数字num是否合法,即同一行、同一列和同一3x3宫内是否存在重复数字,backtrack用于递归地填充数独中的空白位置。
- is_valid函数通过遍历同一行、同一列和同一3x3宫内的数字来判断是否存在重复数字,如果存在则返回False,否则返回True。
- backtrack函数通过两层循环遍历数独中的所有位置,如果遇到空白位置则尝试填入数字1到9,然后递归调用自身进行下一步填充,如果填充成功则返回True,否则将当前位置重置为'.'并返回False。
- 最终调用backtrack函数来填充数独中的空白位置,得到完整的数独解。