作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有这样的幻方。幻方 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/
我是一名优秀的程序员,十分优秀!