用Python求数独
时间: 2024-08-02 11:01:35 浏览: 46
在Python中求解数独可以使用回溯法(Backtracking)作为核心算法。以下是简单的步骤:
1. 定义一个函数,接收一个部分填好的数独网格作为输入。
2. 创建一个递归函数用于尝试填写下一个空白格,如果找到解决方案则返回True,否则尝试所有可能的数字并回溯。
3. 检查当前单元格是否已填好或不在合法范围内(1-9),如果不满足,则尝试所有可能的数字。
4. 对于每个可能的数字,递归地将该数字放入当前单元格并检查剩余的棋盘是否仍符合数独规则。
5. 如果所有数字都不符合条件,就回溯到上一步,尝试下一个数字。
这里是一个基础的Python回溯实现示例,但请注意实际项目可能需要用到更复杂的数据结构和优化技术:
```python
def is_valid(board, row, col, num):
# 检查行、列和宫格
for i in range(9):
if board[row][i] == num or board[i][col] == num:
return False
if (row // 3) * 3 + i // 3 == (row % 3) * 3 + col // 3:
if board[(row // 3) * 3 + i // 3][(col // 3) * 3 + i % 3] == 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): # 递归求解
return True
else:
board[row][col] = 0 # 回溯
return False # 无法找到解决方案
return 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("Solved:")
print(board)
else:
print("No solution exists.")
```
阅读全文