实际上,我构建了这样一个野兽,既是求解器又是生成器,并且我使用了 2D 数组。效果很好。
您只需要了解索引以及它们的位置,掌握起来并不难。
一行中的单元格之间的相对关系不会因列而改变,列中的单元格,甚至是小方块中的单元格也是如此。
有时,一个不那么“优雅”的解决方案就可以了。确实,有时,它更可取:-)
对于它的价值,您可能对我用于求解器/生成器的算法感兴趣。
首先我编写了求解器部分,它首先将所有单元格设置为可以是任何值,然后依次应用所有规则以查看单个单元格是否可以求解或以其他方式限制,例如:
- 如果单元格是线索中的特定值,请将其设置为该值。
- 如果一行(或列或小方块)中只剩下一个单元格,您可以将其设置为剩余值。
- 如果一个单元格被标记为可能是
N 并且N 存在于它的行/列/小方格中,请消除这种可能性。
- 如果行/列/小方格中有两个单元格并且它们具有相同的两种可能性(并且没有其他可能性),则该行/列/小方格中的所有其他单元格都应该删除这种可能性。
等等,添加我在解决真正难题时使用的每条规则。
对于生成器,我从以下开始:
123 456 789
456 789 123
789 123 456
234 567 891
567 891 234
891 234 567
345 678 912
678 912 345
912 345 678
然后,在一个不同大小(至少 500 个)的循环中,继续以不会产生无效拼图的方式交换行和列。换句话说,将行或列与它们所在的组交换(例如,第 1、2 和 3 行是一个组,第 4、5 和 6 列也是)。
这很好地打乱了单元格,足以产生一个像样的谜题。
然后,我开始选择随机单元格并将它们设置为未知。一旦一个单元格被设置为未知,我会将整个谜题传递给求解器。如果可以解决,我会继续,否则我会恢复单元格并继续。
这阻止了我得到一个逻辑上无法解决的谜题。
完成大量随机单元格删除后,我会尝试使用相同的方法按顺序删除所有剩余的单元格。剩下的就是解决这个难题所需的最少信息量。
而且,所以这对数独初学者来说并不痛苦,我会允许他们指定一个较低的难度级别,这将把一定数量的不必要的单元格放回去。
不错的方案,可能有更好的方案,但对我来说效果很好。
现在,如果我能弄清楚这些 Kakuro 的东西,我会快乐地死去 :-)