You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python数独求解技术问询:人工输入与计算机求解实现及求解过程无法打印结果的问题

解决数独求解时无法实时打印棋盘的问题

咱们先梳理你代码里的几个关键问题,再一步步实现能实时打印的计算机自动求解功能:

1. 先修复输入判断的逻辑错误

你的代码里输入判断的循环和条件写法有问题,会导致逻辑不符合预期:

  • 原循环条件 while Player_Type != 'Human' or 'Computer': 永远为True,因为'Computer'本身是真值,应该改成判断输入是否在合法选项里。
  • 原条件判断 if Player_Type == 'Human' or 'human' or 'HUMAN': 也是错误的,Python会把'human'当成布尔值True,应该统一转成小写后判断。

修复后的输入判断代码:

Player_Type = ''
valid_types = ['human', 'computer']
while Player_Type.lower() not in valid_types:
    Player_Type = input('"Human" or "Computer" solve?: ')
    if Player_Type.lower() == 'human':
        Human_play()
        print_board(sudoku)
        break
    elif Player_Type.lower() == 'computer':
        Computer_play(sudoku)  # 传入sudoku棋盘供求解使用
        break
    else:
        print('Invalid Player Type!\nMake sure you use "Human" or "Computer"')

2. 实现带实时打印的Computer_play求解逻辑

你的Computer_play函数目前只有打印提示,没有核心的数独求解逻辑。我们用回溯法实现,并且在每填充一个数字后打印棋盘,加上延迟让过程可见:

首先写一个辅助函数,判断某个位置填某个数字是否合法:

def is_valid(sudoku, row, col, num):
    # 检查当前行是否有重复数字
    for i in range(9):
        if sudoku[row][i] == str(num):
            return False
    # 检查当前列是否有重复数字
    for i in range(9):
        if sudoku[i][col] == str(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 sudoku[start_row + i][start_col + j] == str(num):
                return False
    return True

然后实现带实时打印的Computer_play主函数:

def Computer_play(sudoku):
    print('The Computer Plays, solving step by step...')
    time.sleep(1)  # 延迟1秒开始,让你准备好查看过程
    
    def solve():
        for row in range(9):
            for col in range(9):
                if sudoku[row][col] == ' ':
                    for num in range(1, 10):
                        if is_valid(sudoku, row, col, num):
                            # 填充合法数字
                            sudoku[row][col] = str(num)
                            # 清屏并打印当前棋盘(Linux/macOS用\033c,Windows用os.system('cls'))
                            print("\033c", end="")
                            print_board(sudoku)
                            time.sleep(0.3)  # 调整延迟时间,控制求解速度
                            # 递归求解下一个空格
                            if solve():
                                return True
                            # 回溯:当前数字无法得到最终解,恢复空格
                            sudoku[row][col] = ' '
                            # 回溯时也打印棋盘(可选,能看到回退过程)
                            print("\033c", end="")
                            print_board(sudoku)
                            time.sleep(0.2)
                    # 所有数字都尝试过,无解则返回False
                    return False
        # 所有空格都填满,求解完成
        return True
    
    solve()
    print("\nSolved!")

3. 关键细节说明

  • 清屏适配:print("\033c", end="")是Linux/macOS的清屏命令,Windows环境需要先导入os模块,然后用os.system('cls')替换。
  • 延迟调节:time.sleep()的参数可以自由调整,数值越大,每一步的间隔越长,方便你看清求解过程。
  • 回溯可视化:代码里保留了回溯时的棋盘打印,如果你不想看回退过程,可以把这部分代码删掉。

4. 完整整合后的代码

把所有修复和新增的代码整合到你的原有代码中,运行后选择Computer模式,就能看到数独一步步被填充的完整过程啦!

内容的提问来源于stack exchange,提问作者user17839607

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 08:47:35