python - 如何在 Python 3 中将幻方转换为合适的幻方?

标签 python python-3.x algorithm

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

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

我想将它转换为一个适当的 3x3 魔方,所有行、列和对角线的总和等于 15,并尽可能进行最小的更改。

我试过排列,但我想不出办法。

最佳答案

从问题中不清楚“更改”是什么,但这段代码假定它意味着用不同的值替换一个数组位置中的值。另一种含义是所需的交换次数(这需要更多的代码)。

这段代码做了一件显而易见的事情:它生成所有幻方(其中只有一个幻方,最多为反射和旋转)并测量到每个幻方的距离,找到最小的一个。

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

关于python - 如何在 Python 3 中将幻方转换为合适的幻方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50082861/

相关文章:

Python:产生有几个要求的子进程

java - 在Python中修改条件表达式中的变量

python - 特殊方法,如 __str__ 返回对象的数字表示形式

python - 为什么 .find() 不能与 python 3 中的 urllib.request.urlopen() 一起使用?

algorithm - 计算斐波那契数列中的前一个数字

python - 工厂男孩 - 如何创建工厂所需的数据(预生成 Hook )

python - watchdog(python) - 仅监视一种文件格式并忽略 'PatternMatchingEventHandler' 中的其他所有内容

python - Python 杂货购物程序中的错误

algorithm - 如何在 d 维球/球体内生成均匀的随机点?

python - 使用 DFS 搜索图形时出现 KeyError