1. 程式人生 > >python: 用把自己蠢哭的方式求3*3幻方

python: 用把自己蠢哭的方式求3*3幻方

先來看一下幻方在百度百科上面的定義:

幻方(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 秒。

然後沒有然後了… 這個演示表明:暴力有時候可以解決問題,但是非常低效!