钻木取火算法Python
时间: 2024-04-16 19:23:20 浏览: 11
钻木取火算法是一种用于求解数独问题的启发式搜索算法。它的基本思想是通过试错的方式,逐步填充数独格子,直到找到一个可行的解。
以下是钻木取火算法的Python实现:
```python
def solve_sudoku(board):
if not find_empty_cell(board):
return True
row, col = find_empty_cell(board)
for num in range(1, 10):
if is_valid(board, row, col, num):
board[row][col] = num
if solve_sudoku(board):
return True
board[row][col] = 0
return False
def find_empty_cell(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
return i, j
return None
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(3):
for j in range(3):
if board[start_row + i][start_col + j] == num:
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):
for row in board:
print(row)
else:
print("No solution exists.")
```
这段代码使用递归的方式实现了数独的求解。它首先找到一个空格子,然后尝试填入数字1-9,检查是否合法。如果合法,则继续递归地填充下一个空格子,直到找到一个可行解或者无解。