我正在尝试使用 Python 中的约束编程来做一个自定义幻方求解器。为此,我使用 python-constraint ( http://labix.org/python-constraint )。
对于这个问题,幻方的定义将是:“幻方是整数(正数或负数)在 nxn 矩阵中的排列,并且使得任何行、任何列或任何主对角线的条目之和是一样的。”
我有一个这样的预填充幻方:
+----+----+----+----+
| 7 | | | 4 |
+----+----+----+----+
| | | | |
+----+----+----+----+
| 0 | -3 | -2 | 3 |
+----+----+----+----+
| -5 | 6 | | |
+----+----+----+----+
这是我使用的代码:
from constraint import *
problem = Problem()
problem.addVariables(range(0, 16), range(-20, 20))
problem.addConstraint(lambda a: a==7, [0])
problem.addConstraint(lambda a: a==4, [3])
problem.addConstraint(lambda a: a==0, [8])
problem.addConstraint(lambda a: a==-3, [9])
problem.addConstraint(lambda a: a==-2, [10])
problem.addConstraint(lambda a: a==3, [11])
problem.addConstraint(lambda a: a==-5, [12])
problem.addConstraint(lambda a: a==6, [13])
problem.addConstraint(ExactSumConstraint(-2), [0,5,10,15])
problem.addConstraint(ExactSumConstraint(-2), [3,6,9,12])
for row in range(4):
problem.addConstraint(ExactSumConstraint(-2),
[row*4+i for i in range(4)])
for col in range(4):
problem.addConstraint(ExactSumConstraint(-2),
[col+4*i for i in range(4)])
solutions = problem.getSolution()
print solutions
我找不到任何解决方案,但我认为我的限制是正确的。每行和每列以及两条对角线的总和必须等于-2(基于我们在幻方上的行)。
你有什么想法 ?谢谢。