把 1 2 3 ... 19 共19个整数排列成六角形状,如下:
* * *
* * * *
* * * * *
* * * *
* * *
要求每个直线上的数字之和必须相等。共有15条直线哦!
再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见图【p1.png】,黄色一行为所求。
请你填写出中间一行的5个数字。数字间用空格分开。
* * *
* * * *
* * * * *
* * * *
* * *
要求每个直线上的数字之和必须相等。共有15条直线哦!
再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见图【p1.png】,黄色一行为所求。
请你填写出中间一行的5个数字。数字间用空格分开。
这是一行用空格分开的整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)
#include<iostream> using namespace std; int a[25]; int visit[25]={0}; bool dfs(int cur) { if(cur==19) { for(int i=1;i<=19;i++) { if(visit[i]==0) { a[19]=i; break; } } if((a[17]+a[18]+a[19]==28+a[3])&& (a[17]+a[18]==a[1]+a[5]+a[10]+a[15])) return true; else return false; } for(int i=1;i<=19;i++) { if(!visit[i]) { visit[i]=1; a[cur]=i; if(cur<7) { if(dfs(cur+1)) return true; } else if(cur==7) { if(28+a[3]==a[4]+a[5]+a[6]+a[7]) { if(dfs(cur+1)) return true; } } else if(cur<=11) { if(13+a[3]==a[4]+a[8]) { if(dfs(cur+1)) return true; } } else if(cur==12) { if((28+a[3]==a[8]+a[9]+a[10]+a[11]+a[12])&& (28+a[3]==a[3]+a[7]+a[12])) { if(dfs(cur+1)) return true; } } else if(cur<=15) { if(28+a[3]==13+a[5]+a[9]+a[13]) { if(dfs(cur+1)) return true; } } else if(cur<=17) { if((28+a[3]==13+a[6]+a[11]+a[16])&& (28+a[3]==a[13]+a[14]+a[15]+a[16])) { if(dfs(cur+1)) return true; } } else if(cur==18) { if((28+a[3]==a[4]+a[9]+a[14]+a[18])&& (28+a[3]==a[7]+a[11]+a[15]+a[18])) { if(dfs(cur+1)) return true; } } visit[i]=0; } } return false; } int main() { a[1]=15; a[2]=13; visit[15]=visit[13]=1; if(dfs(3)) cout<<a[8]<<' '<<a[9]<<' '<<a[10]<<' '<<a[11]<<' '<<a[12]<<endl; else cout<<0<<endl; return 0; }
答案:9 6 5 2 16