第 74 讲:算法源代码
2021-11-02 01:26 作者:SunnieShine | 我要投稿
下面列举在前文提到或使用到的一些算法源代码。
Part 1 回溯法算法代码
由于回溯是相对比较简单的算法,所以我们使用C语言进行描述。它的代码如下。
测试的结果如下。

可以从思路上发现,回溯法无法验证题目的唯一性,但它可以验证题目是否有解。如果题目无解,则没有任何的结论的输出;但如果有解,它就会尝试输出一个解,并退出程序(不过你可以考虑更改“n == 81”条件内执行的语句来更改得到解时候的执行逻辑。
不过由于C语言不支持异常,所以我们无法控制输出固定个数解的操作。不过在其它的高级编程语言里,我们可以采用异常机制,当输出的解的总数超出一定限度的时候,让该递归函数抛出递归跳出的异常(例如Java的InterruptedException)来跳出执行。
Part 2 舞蹈链算法代码
这里列出舞蹈链算法的源代码,为了思路更为清晰,此处将使用C#语言描述。
2-1 数据节点文件(DataNode.cs)
2-2 列节点文件(ColumnNode.cs)
2-3 舞蹈链文件(DancingLink.cs)
2-4 矩阵行节点文件(DancingLink.MatrixRow.cs)
2-5 解题器对象(DancingLinksSolver.cs)
2-6 主方法调用(Program.cs)
Part 3 Linq解法算法代码
在数独里,我们甚至可以使用Linq轻松完成一个题目的解题,而且比纯回溯要更快一些。我们可以尝试使用Linq自带的查询和替代功能,为一个数独盘面(字符串形式)进行解题。代码如下(使用C# 8提供的语法)。
可以从代码里看出,实际上它就是在不断替换字符为0(0表示空格)的地方,然后得解的操作。