编写一个Python程序来解决数独游戏
发布时间:2023-12-04 14:40:52
数独是一种基于逻辑的数字填充游戏,目标是在9x9的网格中填充数字1-9,使每一行、每一列和每一个3x3的方格中都包含1-9的数字,且不重复。
在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
if board[i][col] == num:
return False
if board[3*(row//3)+i//3][3*(col//3)+i%3] == num:
return False
return True
def print_board(board):
for i in range(9):
for j in range(9):
print(board[i][j], end = ' ')
print()
# 使用示例
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("解决方案:")
print_board(board)
else:
print("没有解决方案")
在上述代码中,solve_sudoku(board) 函数用于解决数独问题。它首先查找空单元格,如果没有空单元格,则表示数独已经解决完毕,返回True。然后尝试填充数字1-9,并检查填充是否有效。如果有效,继续递归调用solve_sudoku(board),直到找到解决方案或无解。如果无法填充数字,则回退到上一个状态,继续尝试其他数字。
find_empty_cell(board) 函数用于找到数独中的空单元格。
is_valid(board, row, col, num) 函数用于检查填充数字是否有效,即判断是否满足数独的规则。
print_board(board) 函数用于打印解决方案。
在程序运行中,我们使用一个9x9大小的列表作为数独的输入,其中已知数字用0表示。然后调用solve_sudoku(board) 函数来解决数独问题。如果有解,打印解决方案,否则打印无解。
以上是一个简单的数独求解程序的实现。你可以使用不同的输入来测试程序并观察结果。
