继续上面数独代码的编写
时间: 2023-03-05 11:27:00 浏览: 63
好的,我们继续上面的数独代码编写。在上一次中,我们已经定义了一个函数 `print_board` 来打印数独棋盘,接下来我们将定义一个函数来检查当前棋盘是否合法。
## 检查数独棋盘是否合法
数独棋盘合法的条件是每行、每列和每个九宫格中不能有重复的数字。我们可以先定义一个函数 `is_valid` 来检查某一行、某一列或某一个九宫格是否合法,然后在检查整个棋盘时调用这个函数。
```python
def is_valid(nums):
"""
检查一个数组中的数是否合法
"""
nums = [i for i in nums if i != '.'] # 去掉数组中的空格
return len(set(nums)) == len(nums)
def is_valid_sudoku(board):
"""
检查数独棋盘是否合法
"""
# 检查每一行
for i in range(9):
if not is_valid(board[i]):
return False
# 检查每一列
for j in range(9):
if not is_valid([board[i][j] for i in range(9)]):
return False
# 检查每一个九宫格
for i in range(0, 9, 3):
for j in range(0, 9, 3):
if not is_valid([board[m][n] for m in range(i, i + 3) for n in range(j, j + 3)]):
return False
return True
```
上面的 `is_valid` 函数检查一个数组中的数是否合法,去掉数组中的空格之后,使用 Python 的集合(set)数据结构来判断是否存在重复的数。`is_valid_sudoku` 函数则是检查整个数独棋盘是否合法,它依次检查每一行、每一列和每一个九宫格是否合法,如果存在不合法的情况,直接返回 False。
## 填充数独棋盘
接下来,我们将定义一个函数来填充数独棋盘。我们使用回溯法来填充棋盘。回溯法是一种经典的深度优先搜索算法,用于求解一些组合问题,比如数独、八皇后等。
```python
def solve_sudoku(board):
"""
填充数独棋盘
"""
def backtrack(board, i, j):
if j == 9:
# 当前行已经填完,开始填下一行
return backtrack(board, i + 1, 0)
if i == 9:
# 所有行都填完了,返回 True 表示找到了一个解
return True
if board[i][j] != '.':
# 当前位置已经有数字,跳过