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