14-2 六角幻方

36 篇文章 1 订阅
21 篇文章 0 订阅

把 1 2 3 ... 19 共19个整数排列成六角形状,如下:

    * * *
   * * * *
  * * * * *
   * * * * 
    * * *

    要求每个直线上的数字之和必须相等。共有15条直线哦!

    再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见图【p1.png】,黄色一行为所求。

    请你填写出中间一行的5个数字。数字间用空格分开。

线序编号,再dfs,边填号边检查当前已有的线和a[1]+a[2]+a[3]是否相等,不相等则剪枝,填到第八个数才形成第二条线,从8往后试探的加剪枝即可,直到答案可以枚举验证(不过最后就出来唯一解了~)python跑的好慢啊!


def dfs(cur):
    global a,vis
    if cur==20:
        if a[17]+a[18]+a[19]==28+a[3] and a[17]+a[18]==a[1]+a[5]+a[10]+a[15]:
            for i in range(1,20):
                print(a[i],end=" ")
            print()
            print("%d %d %d %d %d"%(a[8],a[9],a[10],a[11],a[12]))
        return
    if cur==8:
        if 28+a[3]!=a[4]+a[5]+a[6]+a[7]:
            return
    if cur==9:
        if 15+a[4]+a[8]!=28+a[3]:
            return 
    if cur==13:
        if a[8]+a[9]+a[10]+a[11]+a[12]!=28+a[3] or a[3]+a[7]+a[12]!=28+a[3]:
            return
    if cur==14:
        if 28+a[3]!=13+a[5]+a[9]+a[13]:
            return
    if cur==17:
        if 13+a[6]+a[11]+a[16]!=28+a[3] or a[13]+a[14]+a[15]+a[16]!=28+a[3]: 
            return
    if cur==18:
        if a[3]+a[6]+a[10]+a[14]+a[17]!=28+a[3] or a[8]+a[13]+a[17]!=28+a[3]:
            return
    if cur==19:
        if 13+a[6]+a[11]+a[16]!=28+a[3] or a[13]+a[14]+a[15]+a[16]!=28+a[3]:
            return 
    for i in range(1,20):
        if vis[i]==0:
            vis[i]=1
            a[cur]=i
            dfs(cur+1)
            vis[i]=0
a = [0 for _ in range(20)]
vis = [0 for _ in range(20)]
a[1] = 15
a[2] = 13
vis[13]=vis[15]=1;
dfs(3)#当前已经填了多少

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值