对于元组来说是不同的

时间:2016-05-18 07:11:37

标签: prolog sudoku clpfd eclipse-clp

我正在尝试用每个数字有9个位置的观点来解决数独。这是我数独的代表:

sudoku

从表中可以看到数字 5 在数独中有以下位置(Row,Col):( 2,8),(4,2),(6,5)。< / p>

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

例如,上面的 1 行。

我所做的是以下内容:

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

以上的工作正常,我得到了数独的解决方案,但没有正确的解决方案。这是因为我还要检查一件事:每个职位必须不同。根据我的求解器的当前状态,我可以得到一个在同一位置有多个数字的解决方案,fe: 2 3 都可以位于(5) ,7)因为我不检查所有位置是否不同。

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

编辑:添加了代码

code

1 个答案:

答案 0 :(得分:4)

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

所以,你的问题实际上可以简化为:

  

我怎么能单独映射整数对整数?

假设您有A-B形式的对,其中AB都被约束为1..9

我可以通过多种方式将这些对以一对一的对应关系放到整数中。一个非常简单的功能是: 9×A + B 。想一想!

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

练习:考虑其他可能的映射及其属性。然后概括它们以处理元组