如何修复基于回溯法的Python数独求解器返回空的问题?
解决你的数独求解器返回空结果的问题
嘿,我看了你的数独求解器代码片段,发现几个关键问题导致它返回空结果并提示数独无效,咱们一步步来修复:
1. 全局变量e的坑
你用了全局列表e来存储空单元格的坐标,但回溯法是递归执行的,这个全局变量会被后续的checkEmpty调用覆盖,导致之前的递归层拿到错误的单元格坐标,直接打乱了回溯逻辑。
咱们把checkEmpty改成直接返回坐标元组(没有空单元格时返回None),彻底避免全局变量的干扰:
def checkEmpty(): for i in range(9): for j in range(9): if board[i][j] == 0: return (i, j) # 返回空单元格的(row, col) return None # 没有空单元格了
2. 缺失的合法性检查函数
从你的代码片段看,应该还缺少一个验证数字是否能填入当前单元格的函数。这个函数要检查三个维度:当前行、当前列、所在的3x3小宫格不能有重复数字:
def is_valid(board, row, col, num): # 检查当前行是否已有该数字 for col_idx in range(9): if board[row][col_idx] == num: return False # 检查当前列是否已有该数字 for row_idx in range(9): if board[row_idx][col] == num: return False # 检查所在3x3宫格是否已有该数字 box_start_row = (row // 3) * 3 box_start_col = (col // 3) * 3 for i in range(3): for j in range(3): if board[box_start_row + i][box_start_col + j] == num: return False return True
3. 完整的回溯求解函数
现在把这些整合起来,写一个递归的回溯求解函数:
def solve_sudoku(board): empty_cell = checkEmpty() if not empty_cell: return True # 没有空单元格,说明数独已经解出来了 row, col = empty_cell # 尝试填入1-9的数字 for num in range(1, 10): if is_valid(board, row, col, num): board[row][col] = num # 递归求解,如果后续能解出来,就返回True if solve_sudoku(board): return True # 回溯:如果当前数字导致后续无解,把单元格恢复为空 board[row][col] = 0 # 所有数字都试了,都无解,说明这个数独确实无效 return False
测试你的数独
最后调用这个函数并打印结果:
board = [[3,0,6,5,0,8,4,0,0], [5,2,0,0,0,0,0,0,0], [0,8,7,0,0,0,0,3,1], [0,0,3,0,1,0,0,8,0], [9,0,0,8,6,3,0,0,5], [0,5,0,0,9,0,6,0,0], [1,3,0,0,0,0,2,5,0], [0,0,0,0,0,0,0,7,4], [0,0,5,2,0,6,3,0,0]] if solve_sudoku(board): print("求解成功:") for row in board: print(row) else: print("数独无效,无解")
运行这段代码后,你的数独应该能正常解出来,不会再返回空结果啦。
内容的提问来源于stack exchange,提问作者user8502474
相关产品推荐
相关产品推荐

