回溯法

通过试错探索解答的算法。遇到死路时回退到之前的状态尝试其他选择。

回溯法 (Backtracking) 是基于深度优先搜索的问题求解算法。在数独求解器中,向空格试填数字,如果产生约束冲突则回退到之前的状态尝试其他数字。由于系统地探索所有组合,只要解存在就一定能找到。

在数独求解器中的作用

试填与回退的步骤
  1. 选择候选数最少的格子

    若从只有两个候选数的格子开始,即便第一次猜错,也只剩一条分支需要尝试。这一选择很大程度上决定了搜索量。

  2. 试填其中一个候选数

    填入的是「暂定的一手」而非确定的数字,并记录下来以便日后撤销。

  3. 用约束传播填上能够确定的格子

    因这次试填而只剩一个候选数的格子会被连锁填入,若存在矛盾便会在早期显现。

  4. 是否产生了矛盾

    把盘面回退到该次试填之前,在同一格改试别的候选数。这就是回溯法。

    若仍有空格,则回到第一步选择下一个格子。

  5. 所有格子填满时,解便完成

步骤 1 至 4 构成循环。回退时只撤销最近一次试填,因此在此之前确定的部分不会白费。每次试填之间越多地插入约束传播,矛盾就暴露得越早,需要尝试的分支也越少。

当仅靠约束传播无法解决谜题时,回溯法作为最终手段发挥作用。从候选数最少的格子开始试填,产生矛盾时回退。与约束传播结合使用可以大幅缩小搜索空间。

与人类解法的区别

人类倾向于避免回溯 (猜测),只使用能逻辑确定的步骤来求解。这是由工作记忆的限制决定的。同时记忆和管理多个假设状态对人类来说非常困难。数独的难度设计以「人类能否不猜测就解出」为标准。