解决Kakuro难题

时间:2010-10-29 20:12:50

标签: c algorithm

这是一个很好的反思:

http://en.wikipedia.org/wiki/Kakuro

我正试图为这个游戏做一个解算器。完成了文书工作(读取具有可变数量的列和行的初始文件。假设输入文件遵循游戏规则,因此游戏总是可以解决。花点时间阅读游戏规则。

我已经处理了我认为最适合的数据结构:

struct aSquare { int verticalSum; int horizontalSum; int value; }

并动态制作这些动作的“数组”。 我做到这一点,黑色方块的值为-1,白色方块(实际解方块)初始化为0.您还可以轻松地从数组中获取每个aSquare结构的位置,无需为其创建其他结构字段

现在算法......我将如何在世界上调和所有这些总和并找到解决所有类型网格的一般方法。我整个下午都在苦苦挣扎,无济于事。

感谢帮助,玩得开心!

*编辑:我刚刚意识到我发布的实际链接有一些关于解决技术的提示。我仍然会继续观察人们的想法。

6 个答案:

答案 0 :(得分:6)

关于约束编程:以下是如何使用约束编程解决Kakuro拼图的一些不同实现(所有这些都使用相同的基本原理)。问题实例已在程序中修复。

编辑:添加了Google或-tools / C#和答案集编程。

答案 1 :(得分:5)

一个简单的数独蛮力解算器需要几毫秒才能运行,所以你不必费心去实施任何特殊的战术。我认为,就Kakuro而言,这将是相同的。一个简单的算法:

def solve(kakuro):
    if kakuro has no empty fields:
        print kakuro
        stop.
    else:
        position = pick a position
        values = [calculate possible legal values for that field]
        for value in values:
            kakuro[position] = value
            solve(kakuro)
        kakuro[position] = None # unset after trying all possibilities

如果您找到要填充的最佳字段顺序,此算法可能会更好。尝试选择最受约束的字段(如:合法的值不多)。

无论如何,这可能是最简单的实现,所以尝试它并寻找更复杂的解算器,只有当这个解决方法不起作用时。 (实际上,这是最简单的约束编程求解器之一;当然,真正的CP求解器要复杂得多。)

答案 2 :(得分:2)

如果您最终想要为这些游戏制作软件解算器,但没有深入了解算法细节,我建议使用约束编程(CP)引擎。 CP是一种声明式编程范例,非常适合这些问题。有几种商用和开源CP引擎可供使用。

http://en.wikipedia.org/wiki/Constraint_programming

答案 3 :(得分:1)

我猜想 Linear Programming 可以很容易地用来解决这种游戏..那么这是一个完整的问题,确实存在确切的解决方案..(分支并绑定切割平面?)

在任何情况下,使用具有最确定组合的表格肯定会有用(例如http://www.enigmoteka.com/Kakuro%20Cheatsheet.pdf

答案 4 :(得分:0)

这是直接的线性代数,使用矢量/矩阵操作技术来解决。

[编辑 - 回答评论]

a + b + 0 + d + 0  = n1
0 + b + c + 0 + e  = n2
a + 0 + c + 0 + 0  = n3
a + b + c + 0 + e  = n4
a + 0 + c + d + 0  = n5

上面转换为矩阵,通过加上和减去行的倍数,你最终会得到:

a 0 0 0 0 na
0 b 0 0 0 nb
0 0 c 0 0 nc
0 0 0 d 0 nd
0 0 0 0 e ne

没有组合学,都是整数。

答案 5 :(得分:0)

我找到了一些很好的位操作技巧,可以加速Kakuro的解决。您可以选择来源here