我有这样的魔法方块。幻方3x3中的数字只能是1-9:
magic_square = [[5,3,4],
[1,5,8],
[6,4,2]]我想将它转换成一个适当的3x3幻方,所有行、列和对角线相等于和15,并尽可能地进行最小的更改。
我试过排列排列,但我想不出怎么做。
发布于 2018-04-29 06:37:22
从问题中还不清楚“更改”是什么,但这段代码假设它意味着用不同的值替换一个数组位置中的值。另一种含义是所需的掉期数量(这需要更多代码)。
这个代码做了一件显而易见的事情:它生成所有的幻方(其中只有一个直到反射和旋转),并测量到每一个的距离,找到最小的一个。
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 2https://stackoverflow.com/questions/50082861
复制相似问题