Python:每日一题之四阶幻方(DFS剪枝)

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

把 1 ~ 16 的数字填入 4×4 的方格中,使得行、列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方。

四阶幻方可能有很多方案。如果固定左上角为 1,请计算一共有多少种方案。

比如:

  1  2 15 16
 12 14  3  5
 13  7 10  4
  8 11  6  9

以及:

  1 12 13  8
  2 14  7 11
 15  3 10  6
 16  5  4  9

就可以算为两种不同的方案。

思路:

参考代码:

def dfs(n):
  global cnt
  if n>=4 and m[0]+m[1]+m[2]+m[3]!=34:  return
  if n>=7 and m[0]+m[4]+m[5]+m[6]!=34:  return
  if n>=10 and m[1]+m[7]+m[8]+m[9]!=34:  return
  if n>=11 and m[3]+m[6]+m[8]+m[10]!=34:  return
  if n>=12 and m[4]+m[7]+m[10]+m[11]!=34:  return
  if n>=14 and m[5]+m[8]+m[12]+m[13]!=34:  return
  if n>=15 and m[2]+m[10]+m[12]+m[14]!=34:  return
  if n>=16 and (m[3]+m[11]+m[13]+m[15]!=34 or m[6]+m[9]+m[14]+m[15]!=34 or m[0]+m[7]+m[12]+m[15]!=34):  return
  if n==16:  cnt+=1
  for i in range(2,17):
    if vis[i]==0:
      m[n]=i
      vis[i]=1
      dfs(n+1)
      vis[i]=0

cnt=0
vis=[0]*17
vis[1]=1
m=[0]*17  #用一维数组表示幻方
m[0]=1    #1 被固定
dfs(1)
print(cnt)
# print(416) 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的敲码工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值