如何显示数独解决方案是独一无二的

时间:2011-02-19 19:00:49

标签: algorithm sudoku

鉴于一个未解决的数独,如何证明它有一个独特的解决方案?

6 个答案:

答案 0 :(得分:3)

尝试找到两种解决方案。

最简单的算法是具有回溯功能的强力recursive algorithm。找到第一个解决方案后,回溯并寻找第二个解决方案。这很慢但是(与仅依赖逻辑的算法不同),它保证能够最终找到所有解决方案。因此,如果此算法终止只找到一个解决方案,那么该解决方案必须是唯一的。

这对于容易出问题很有用,但是对于更难的问题可能需要数小时或数天。如果您需要更快的速度,可以使用许多优化。

简单的优化是跟踪每个方块的候选列表。在每一步找到候选人最少的广场。如果只有一个候选者,请选择该数字,更新网格和其他方格的候选者,然后继续。如果没有候选人,你就会知道你之前做出的猜测是错误的,所以你应该回溯。

更高级的优化涉及寻找允许您在不进行猜测的情况下推断数字的模式。以下是一些例子:

答案 1 :(得分:3)

某些配置最终会导致非唯一解决方案,例如:

* *  *  | * * * | * * *
* *  *  | * * * | * * *
* 12 12 | * * * | * * *
--------+-------+------
* *  *  | * * * | * * *
* *  *  | * * * | * * *
* 12 12 | * * * | * * *
--------+-------+------
* *  *  | * * * | * * *
* *  *  | * * * | * * *
* *  *  | * * * | * * *

其中* s可以是任意数字,12是这些单元格中的唯一可能性。在这种情况下,肯定会有至少两种可能的解决方案:

* * * | * * * | * * *    * * * | * * * | * * *
* * * | * * * | * * *    * * * | * * * | * * *
* 1 2 | * * * | * * *    * 2 1 | * * * | * * *
------+-------+------    ------+-------+------
* * * | * * * | * * *    * * * | * * * | * * *
* * * | * * * | * * *    * * * | * * * | * * *
* 2 1 | * * * | * * *    * 1 2 | * * * | * * *
------+-------+------    ------+-------+------
* * * | * * * | * * *    * * * | * * * | * * *
* * * | * * * | * * *    * * * | * * * | * * *
* * * | * * * | * * *    * * * | * * * | * * *

在不计算剩余的电路板的情况下,您可以确定此Sudoku的解决方案不是唯一的。但是,即使在某些情况下可以证明拼图的解决方案不是唯一的;证明拼图解决方案唯一的唯一方法是使用强力计算可能的解决方案集只包含1个解决方案。

有一些快捷方式而不是纯粹的暴力,但是在编写混合求解器时需要格外小心。大多数数独求解技术允许你找到多个解决方案,如果它们存在但是一些先进的数独求解技术依赖于正确的数独有独特解决方案的事实,并且可能导致你无法找到第二个解决方案。

答案 2 :(得分:2)

Soduko是一个CSP到81个变量,每个盒子一个。使用从A1到A9的变量名称作为顶行(从左到右),到I1-I9作为底行。 空白框具有域{1,2,3,4,5,6,7,8,9},并且它们已经填充了由单个值组成的域。 还有27个不同的约束“全部不同”,每个行,列和框9个框。

您可以将AC-3算法用于简单模式,或将PC-2用于更困难的模式,但这会产生更多的计算成本。

答案 3 :(得分:0)

在我看来,唯一的办法就是解决它。如果你能够解决它(没有猜测 - 只有100%'移动')那么这意味着它只有一个解决方案。如果你无法解决它,那么我看到的唯一方法是使用强力算法并检查你能找到多少实际解决方案。

答案 4 :(得分:0)

如上所述,可以使用带有回溯的蛮力递归算法。我只建议一次向上应用两次算法。这意味着候选值在搜索时会逐渐增加,然后向下使用算法,这意味着将候选值以从最大可能数到1的降序进行检查,然后可以检测到至少两个解。如果上升和下降方法的结果保持不变,那么人们可以说这个难题具有独特的解决方案。

答案 5 :(得分:0)

使用回溯技术穷尽所有可能的解决方案。如果你得到了解决方案。解决方案计数器 +1。如果计数器增加超过 1,您可以声明此拼图有 1 个以上的解决方案并退出程序。否则,您必须等到它完成。如果 counter = 1,您确认它有一个解决方案。如果 counter = 0,则无解。