我正在尝试用每个数字有9个位置的观点来解决数独。这是我数独的代表:
从表中可以看到数字 5 在数独中有以下位置(Row,Col):( 2,8),(4,2),(6,5)。< / p>
例如,上面的行是 1 行。
我所做的是以下内容:
alldifferent
中的ic_global
检查该行中的所有ROW值是否不同。alldifferent
。以上的工作正常,我得到了数独的解决方案,但没有正确的解决方案。这是因为我还要检查一件事:每个职位必须不同。根据我的求解器的当前状态,我可以得到一个在同一位置有多个数字的解决方案,fe: 2 和 3 都可以位于(5) ,7)因为我不检查所有位置是否不同。
我该如何解决这个问题? 我试图以元组形式将所有位置放在一个列表中,然后检查所有元组是否不同但我已经挣扎了几个小时而且我真的很绝望。我希望我能在这里找到解决方案。
编辑:添加了代码
答案 0 :(得分:4)
如您所知,all_different/1
及相关约束适用于整数。此外,在您的情况下,您实际上对元组的特殊情况感兴趣,即由行和列组成的对。
所以,你的问题实际上可以简化为:
我怎么能单独映射整数对整数?
假设您有A-B
形式的对,其中A
和B
都被约束为1..9
。
我可以通过多种方式将这些对以一对一的对应关系放到整数中。一个非常简单的功能是: 9×A + B 。想一想!
因此,我建议您以这种方式或类似方式将这些位置映射到整数,然后在这些整数上发布all_different/1
。
练习:考虑其他可能的映射及其属性。然后概括它们以处理元组。