六角幻方
把 1 2 3 ... 19 共19个整数排列成六角形状,如下:
* * *
* * * *
* * * * *
* * * *
* * *
要求每个直线上的数字之和必须相等。共有15条直线哦!
再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见图【p1.png】,黄色一行为所求。
请你填写出中间一行的5个数字。数字间用空格分开。
这是一行用空格分开的整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)
把 1 2 3 ... 19 共19个整数排列成六角形状,如下:
* * *
* * * *
* * * * *
* * * *
* * *
要求每个直线上的数字之和必须相等。共有15条直线哦!
再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见图【p1.png】,黄色一行为所求。
请你填写出中间一行的5个数字。数字间用空格分开。
这是一行用空格分开的整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)
9 6 5 2 16
思路:用DFS ,提前判断(剪枝) 来减少运行时间,在这里我是把15条线全都列出来
#include<iostream>
using namespace std;
int a[17]={0};
bool visit[20]={false};
void dfs(int m)
{
int k;
if(m==5)//表示已经搜索完 a[0-4]
{
k=15+13+a[0];//用来记录每条线相等的那个值
if(k!=a[1]+a[2]+a[3]+a[4])
return ;
}
if(m==6)
{
k=15+13+a[0];
if(k!=15+a[1]+a[5])
return ;
}
if(m==10)
{
k=15+13+a[0];
if(k!=a[0]+a[4]+a[9]||k!=a[5]+a[6]+a[7]+a[8]+a[9]) //必须得全都 相等,只要有一个不相等就退出
return ;
}
if(m==15)
{
k=15+13+a[0];
if(k!=13+a[2]+a[6]+a[10]||k!=a[0]+a[3]+a[7]+a[11]+a[14]||k!=13+a[3]+a[8]+a[13]
||k!=a[10]+a[11]+a[12]+a[13])
return ;
}
if(m==17)
{
k=15+13+a[0];
if(k!=a[14]+a[15]+a[16]||k!=a[4]+a[8]+a[12]+a[15]||k!=a[9]+a[13]+a[16]
||k!=15+a[2]+a[7]+a[12]+a[16]||k!=a[1]+a[6]+a[11]+a[15]
||k!=a[5]+a[10]+a[14])
return ;
else
for(int i=0;i<17;i++)
cout<<a[i]<<" ";
}
else for(int i=1;i<=19;i++)
{
if(!visit[i])
{
a[m]=i;
visit[i]=true;
dfs(m+1);
visit[i]=false;
}
}
}
int main()
{
visit[13]=true;
visit[15]=true;
dfs(0);
return 0;
}