我有这样的魔方。魔方3x3中的数字只能是1-9:
magic_square = [[5,3,4],
[1,5,8],
[6,4,2]]
我希望将其转换为适当的3x3魔方,所有行,列和对角线等于15,并且可以进行最小的更改。
我尝试了排列,但我无法找到办法。
答案 0 :(得分:3)
从问题中可以看出,"变化"是,但此代码假定它意味着用不同的值替换一个数组位置中的值。另一种含义是需要的交换数量(需要更多代码)。
这段代码做了很明显的事情:它生成所有魔术方块(其中只有一个可以反射和旋转)并测量到每个方块的距离,找到最小的方块。
import itertools
def ms():
rows = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]]
for p in itertools.permutations(range(1, 10)):
if all(sum(p[i] for i in r) == 15 for r in rows):
yield list(p)
def closest_ms(m):
m = sum(m, [])
return min(ms(), key=(lambda x: sum(i!=j for i, j in zip(m, x))))
magic_square = [[5,3,4],
[1,5,8],
[6,4,2]]
print(closest_ms(magic_square))
代码返回魔术方块,其中包含与原始元素共同的6个元素:
8 3 4
1 5 9
6 7 2