标题:六角填数

蓝桥杯 2014本科C++ B组 六角填数 枚举排列-LMLPHP

  如图【1.png】所示六角形中,填入1~12的数字。

使得每条直线上的数字之和都相同。

图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?

请通过浏览器提交答案,不要填写多余的内容。

简单的枚举排列,只要提前将12个结点标号,来判断六个线段总和是否相等。

答案是 10       (num[7]这是我标定的序号)

代码如下:

 #include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 13
int num[MAXN];
int used[MAXN];
bool flag=false;
using namespace std;
void dfs(int cur)
{
int i,j;
bool ok;
if(cur==)
{
if(num[]+num[]+num[]+num[]==num[]+num[]+num[]+num[]&&num[]+num[]+num[]+num[]==num[]+num[]+num[]+num[]&&num[]+num[]+num[]+num[]==num[]+num[]+num[]+num[]&&num[]+num[]+num[]+num[]==num[]+num[]+num[]+num[]&&num[]+num[]+num[]+num[]==num[]+num[]+num[]+num[])
{
for(i=;i<=;i++)
cout<<num[i]<<endl;
flag=true;
}
}
for(i=;i<=;i++)
{
ok=true;
for(j=;j<=cur-;j++)
{
if(used[i]||num[j]==i)
ok=false;
}
if(ok)
{
num[cur]=i;
used[i]=;
dfs(cur+);
}
if(flag)
return;
used[i]=;
}
}
int main()
{
memset(used,,sizeof(used));
used[]=;
used[]=;
used[]=;
num[]=;
num[]=;
num[]=;
dfs();
return ;
}
05-11 00:51