把 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)#当前已经填了多少