数独回溯递归求解代码核心执行逻辑疑问,含测试用例与运行结果
数独回溯算法核心逻辑解答
核心逻辑基础
你贴的这段代码是典型的回溯法实现数独求解,核心思路是:逐个查找空单元格(值为0),从小到大试填1-9的合法数字,填完后递归处理后续的空单元格,如果后续路径走不通就撤销当前填数,试下一个可能的数字,直到所有单元格都填满合法值。
疑问解答
1. board[row][col] = 0的执行时机
这行是回溯撤销操作,执行场景如下:
当你给当前单元格填了一个合法数字后,递归调用的solve(board)执行完毕(意味着后续所有空单元格的所有可能组合都已经尝试过,且没有找到可行解),程序回到当前递归层,就会执行这行代码把当前单元格恢复为空,继续试下一个可能的数字。
举个对应你测试用例的实际例子:第一个空单元格是第0行第1位,你先试填1,递归处理后面的格子时发现无论怎么填都有冲突,递归函数返回后,就会执行这行代码把第一个格子改回0,接着试填2。
2. 无合法数字时的执行逻辑
你的理解完全正确:
当遍历完1-9所有数字,要么不符合is_valid的校验规则,要么填完后递归走不通,整个for num in range(1,10)循环执行完毕后,就会走到return False的逻辑,退出当前层的递归函数,回到上一层递归继续尝试其他数字。
补充说明
你贴的原代码缺少了找到完整解后的终止逻辑:当遍历完所有单元格都没有找到0时,说明数独已经解完,需要加一行return True,同时递归调用solve(board)后要判断返回值,如果返回True就直接退出,避免不必要的回溯。补充后的solve函数逻辑如下:
def solve(board): for row in range(9): for col in range(9): if board[row][col] == 0: for num in range(1,10): if is_valid(board, row, col, num): board[row][col] = num if solve(board): # 找到解直接返回,不回溯 return True board[row][col] = 0 return False return True # 所有格子填满,找到解
内容的提问来源于stack exchange,提问作者abdurion
相关产品推荐
相关产品推荐

