python 求解数独
时间: 2024-09-27 08:06:57 浏览: 42
Python求解数独是一种常见的算法应用,通常使用回溯法(Backtracking)来解决。这个过程可以分为以下几个步骤:
1. **初始化**:创建一个9x9的二维数组表示数独矩阵,其中0代表空格。
2. **递归函数**:定义一个名为`solve_sudoku`的递归函数,它接收当前的数独状态作为输入。初始状态下,所有空格都是0。
3. **检查并填写**:遍历每一行、每一列以及每个3x3的小宫格,如果找到空格(值为0),尝试填入1到9的数字,然后检查是否违反数独规则(即同一行、列和小宫格内数字不得重复)。
4. **回溯**:如果发现当前位置不符合数独规则,就回溯到上一个空格,尝试下一个数字;如果所有数字都试过都不成功,则返回上一层继续搜索。
5. **终止条件**:当所有的空格都被填充并且满足数独规则时,说明找到了一个解决方案,返回该矩阵。
以下是一个简单的Python代码示例:
```python
def is_valid(board, row, col, num):
# 检查行
for i in range(9):
if board[row][i] == num:
return False
# 检查列
for i in range(9):
if board[i][col] == num:
return False
# 检查3x3小宫格
start_row = (row // 3) * 3
start_col = (col // 3) * 3
for i in range(start_row, start_row + 3):
for j in range(start_col, start_col + 3):
if board[i][j] == num:
return False
return True
def solve_sudoku(board):
for row in range(9):
for col in range(9):
if board[row][col] == 0:
for num in range(1, 10):
if is_valid(board, row, col, num):
board[row][col] = num
if solve_sudoku(board): # 如果能找到解决方案,返回True
return True
else:
board[row][col] = 0 # 回溯:还原位置,尝试下一个数字
return False # 找不到解决方案,返回False
return True # 所有空格都已填满,返回True
# 示例:
board = [
[5, 3, 0, 0, 7, 0, 0, 0, 0],
[6, 0, 0, 1, 9, 5, 0, 0, 0],
[0, 9, 8, 0, 0, 0, 0, 6, 0],
[8, 0, 0, 0, 6, 0, 0, 0, 3],
[4, 0, 0, 8, 0, 3, 0, 0, 1],
[7, 0, 0, 0, 2, 0, 0, 0, 6],
[0, 6, 0, 0, 0, 0, 2, 8, 0],
[0, 0, 0, 4, 1, 9, 0, 0, 5],
[0, 0, 0, 0, 8, 0, 0, 7, 9]
]
if solve_sudoku(board):
print("Solution:")
for row in board:
print(row)
else:
print("No solution exists.")
```
阅读全文