3 回答
TA贡献1876条经验 获得超7个赞
简单:
使用高效的回溯算法查找所有解决方案。
如果只有一种解决方案,那么您已经完成。否则,如果您有多个解决方案,请找到大多数解决方案都不相同的位置。在此位置添加号码。
转到1。
我怀疑您会找到比这更快的解决方案。
TA贡献1900条经验 获得超5个赞
这是我自己的SuDoKu程序执行此操作的方式:
从完整的有效木板开始(填写81个数字)。
列出所有81个单元格的位置,并随机洗牌。
只要列表不为空,请从列表中移至下一个位置,然后从相关单元格中删除该数字。
使用快速回溯求解器测试唯一性。从理论上讲,我的求解器能够计算所有解决方案,但是为了测试唯一性,当发现多个解决方案时,它将立即停止。
如果当前电路板仍然只有一种解决方案,请转到步骤3)并重复。
如果当前电路板有多个解决方案,请撤消上一次移除的操作(步骤3),然后从列表中的下一个位置继续执行步骤3。
测试完所有81个位置后停止。
这不仅为您提供了唯一的电路板,而且还为您提供了在不破坏解决方案唯一性的情况下无法删除任何其他编号的电路板。
当然,这只是算法的后半部分。上半部分是首先找到一个完整的有效木板(随机填充!),其工作原理非常相似,但“方向相反”:
从一个空板开始。
在其中一个空闲单元格上添加一个随机数(随机选择该单元格,并根据SuDoKu规则从对该单元格有效的数字列表中随机选择该数字)。
使用回溯求解器检查当前电路板是否至少具有一种有效的解决方案。如果不是,请撤消步骤2,然后重复另一个数字和单元格。请注意,此步骤可能会自己产生完整的有效板,但绝不是随机的。
重复该操作,直到木板完全充满数字为止。
TA贡献1883条经验 获得超3个赞
你可以作弊。从可以解决的现有Sudoku面板开始,然后摆弄它。
您可以将三个3x3块的任何行与任何其他行交换。您可以将三个3x3块的任何列与另一列交换。在每个块行或块列中,您可以交换单行和单列。最后,您可以对数字进行置换,以便在填充位置上存在不同的数字,只要置换在整个板上都保持一致即可。
这些更改都不会使可解决的电路板无法解决。
添加回答
举报