python: 用把自己蠢哭的方式求3*3幻方
阿新 • • 發佈:2019-02-03
先來看一下幻方在百度百科上面的定義:
幻方(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
)。 - 然後看一下輸出,的確得到正確結果了。但是耗時是 45 秒。
然後沒有然後了… 這個演示表明:暴力有時候可以解決問題,但是非常低效!