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
相关产品推荐
相关产品推荐

