欢迎访问宙启技术站
智能推送

编写一个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) 函数来解决数独问题。如果有解,打印解决方案,否则打印无解。

以上是一个简单的数独求解程序的实现。你可以使用不同的输入来测试程序并观察结果。