【发布时间】:2009-10-05 05:03:55
【问题描述】:
我一直在研究数独求解器,我当前的求解器使用回溯算法,但仍然需要很长时间。
我希望在大多数情况下将其缩短到不到一秒。因此,我决定用跳舞链接算法重写它,因为它是更好的蛮力方法之一,尤其适用于数独难题等约束问题。
我尝试阅读 Wiki 和上面的 Knuth's paper,但是它们都有点难以理解并且非常冗长。
我也读过Supedia的版本,似乎一旦到了数独的实现,它就变得太抽象了。
有人可以尝试解释 Dancing Links 算法,而不是从它的推导而是它的实现? (以数独为例就好了)
谢谢!
【问题讨论】:
-
此链接的完整源代码不再可用。并且其中的代码 sn-ps 有一些错误。特别是 unlock(ColumnNode c) 方法。在那篇文章中,该代码是覆盖方法的副本,其中 for 循环中的某些内容已更改。内层循环的迭代器需要向左走而不是向右走,并且需要将链接恢复到原来的样子,不要重复覆盖操作。示例:leftNode.getUp().setDown(leftNode);而不是 leftNode.getUp().setDown(leftNode.getDown());
-
我创建了这个 Sudoku Solver Visualizer,它实现了 Dancing Links 和其他几种算法,包括贪婪最佳优先搜索和回溯。也许你会发现它很有帮助。代码可以在here 找到,虽然它很混乱。我建议只检查可视化工具。
-
我还使用 Dancing Links 为 Sudoku 1 编写了 2 种方法,另一种使用 Hidden Singles。 github.com/Elementrix08/Sudoku