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 秒。

然后没有然后了… 这个演示表明:暴力有时候可以解决问题,但是非常低效!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值