3

我试图以每个数字都有 9 个位置的观点来解决数独问题。这是我的数独的表示:

数独

从表格中您可以看到数字5在数独中具有以下位置 (Row,Col):(2,8),(4,2),(6,5)。

当我在解释中提到一行时,我的意思是这样的一行: 排

例如,上面的 是第1行。

我所做的如下:

  • alldifferent对于每一行,使用from检查该行中的所有 ROW 值是否不同ic_global
  • 执行与上述相同的操作,但随后针对 COLUMN-Values。
  • 对于每一行,检查平方数是否不同(每次使用 row 和 col 值计算),alldifferent再次使用。

上述工作正常,我得到了数独的解决方案,但不是正确的解决方案。这是因为我必须再检查一件事:每个位置都必须不同。使用我的求解器的当前状态,我可以获得一个在同一位置具有多个数字的解决方案,fe: 23都可能位于位置(5,7),因为我不检查所有位置是否不同。

我将如何解决这个问题?我试图以元组形式在一个列表中获取所有位置,然后检查所有元组是否不同,但我已经挣扎了几个小时,我真的很绝望。我希望我能在这里找到解决方案。

编辑:添加代码

代码

4

1 回答 1

4

如您所知,all_different/1相关约束适用于integers。此外,在您的情况下,您实际上对元组的特殊情况感兴趣,即由行和列组成的对。

因此,您的问题实际上可以简化为:

如何将整数对单射地映射到整数?

假设您有一对形式 A-B,其中A和 B都被限制为 1..9

我可以通过多种方式将这些对与整数一一对应。一个非常简单的函数是:9×A + B。想想吧!

因此,我建议您以这种方式或类似的方式将这些位置映射到整数,然后all_different/1在这些整数上发布。

练习:考虑其他可能的映射及其属性。然后将它们推广到处理 tuples

于 2016-05-18T08:55:55.570 回答