先来看一下幻方在百度百科上面的定义:
幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。
好,就根据这个概念,理论上通过穷举法就可以求出k*k
的幻方了。
今天突发奇想,尝试了一下。果然很蠢。
ps:本来准备使用
c++
的,但是,下面的unique()
函数,使用c++
的话,会产生大量重复代码,或者得使用指针了,遂作罢。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @name : luoshusquare.py
# @author : cat
# @date : 2017/7/17.
def unique(a, b, c, d, e, f, g, h, i):
args = a, b, c, d, e, f, g, h, i
return len(set(args)) == len(args)
def equal(a, b, c, d, e, f, g, h, i):
zz = a + b + c
yy = d + e + f
ww = g + h + i
vv = a + e + i
uu = c + e + g
tt = a + d + g
ss = b + e + h
oo = c + f + i
return zz == yy and yy == ww and ww == vv and vv == uu and uu == tt and tt == ss and ss == oo
def match(a, b, c, d, e, f, g, h, i):
return equal(a, b, c, d, e, f, g, h, i) and unique(a, b, c, d, e, f, g, h, i);
def format_result(a, b, c, d, e, f, g, h, i):
return """
{} {} {}
{} {} {}
{} {} {}
""".format(a, b, c, d, e, f, g, h, i)
def LuoShuSquare():
for a in range(1, 10):
for b in range(1, 10):
for c in range(1, 10):
for d in range(1, 10):
for e in range(1, 10):
for f in range(1, 10):
for g in range(1, 10):
for h in range(1, 10):
for i in range(1, 10):
if match(a, b, c, d, e, f, g, h, i):
return format_result(a, b, c, d, e, f, g, h, i)
if __name__ == '__main__':
import time
start = time.time()
print(LuoShuSquare())
end = time.time()
print("spend = {:2}s".format(round(end - start, 2)))
pass
"""
console:
2 7 6
9 5 1
4 3 8
spend = 45.13s
Process finished with exit code 0
"""
n*n
)。然后没有然后了… 这个演示表明:暴力有时候可以解决问题,但是非常低效!