问题描述
我正在开发数独应用,而其中一件需要解决的方法就是数独。我对一些回溯算法进行了很多研究,包括制作自己的版本,但随后遇到了Dancing Links和AlgorithmX。我已经看到了它的一些实现,而且看起来很酷,但是有一些问题-我可以还没有完全解决这个问题(尽管我没有太多的编码经验,所以尽管我使用的是{{3},但我并没有掌握充分理解其核心及其工作原理所需的全部知识) }作为方便参考)
据我了解,您有一个数独,然后将其转换为1和0的数组-最终目的是找到完全为1的行的组合-这意味着我们已经找到了有效的解决方案(是!)
现在,我有点理解普通数独游戏的工作原理-例如,如果我们在左上角的单元格中放置5,则会删除该行和列中的所有其他选项,进而也删除了那个正方形也有一个5。但我不太了解的是,如果我正在做数独变奏,它将如何工作?例如,一种流行的变体类型是X数独,其中,除了正常规则外,您还必须在每个主要对角线上都将数字1到9一次。我能不能假装在数独上有额外的2行/列,它们也需要从1-9填满并以这种方式执行,或者那样行不通?
现在,一个棘手的问题:另一个变种是反骑士数独。基本上,在正常规则之上,您不能拥有与国际象棋骑士相同的移动数字(2进1边)。既然现在就行和其他方面而言,它变得有些不可思议,是否可以将其作为额外约束添加到算法中,以解决沿这些行的数独问题?
解决方法
X-Sudoku可以完全按照您的描述来解决。
反骑士数独比较棘手,因为反骑士约束不能直接适合确切的封面框架。算法X有一个扩展,可以通过在选择不满意的约束时将其视为满意来有效地处理打包约束(至多代替一个约束)。然后,对于由一个数字和两个正方形组成的每三个三分之二的骑士的跳跃,您都有一个打包约束,即这些正方形中最多只有一个正方形被那个数字填充。
如果实施算法X似乎是一个很大的挑战,则可以考虑寻找一个SAT求解器库。