如何在Python 3中将魔方转换为适当的魔方?

时间:2018-04-29 02:31:04

标签: python python-3.x algorithm

我有这样的魔方。魔方3x3中的数字只能是1-9:

magic_square = [[5,3,4],
                [1,5,8],
                [6,4,2]]

我希望将其转换为适当的3x3魔方,所有行,列和对角线等于15,并且可以进行最小的更改。

我尝试了排列,但我无法找到办法。

1 个答案:

答案 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