把 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