六角填数
标题:六角填数 如图【1.png】所示六角形中,填入1~12的数字。 使得每条直线上的数字之和都相同。 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填写多余的内容。
1.利用数组全排列
#include <iostream>
using namespace std;
bool is(int *a)
{
int x1=a[2]+a[3]+a[4]+a[5];
int x2=a[8]+a[9]+a[10]+a[11];
int x3=a[1]+a[3]+a[6]+a[8];
int x4=a[5]+a[7]+a[10]+a[12];
int x5=a[2]+a[6]+a[9]+a[12];
int x6=a[1]+a[4]+a[7]+a[11];
if(x1==x2&&x1==x3&&x1==x4&&x1==x5&&x1==x6&&x1==26)
return true;
return false;
}
bool f(int *a,int pos)
{
if(pos>5)
{
int x1=a[2]+a[3]+a[4]+a[5];
if(x1!=26) return false;//绝对不能构成
}
return true;
}
void swap(int &a,int &b)
{
int t=a;
a=b;
b=t;
}
void fun(int *a,int begin)
{
if(begin<12)
{
if(begin<=2)//第1,2号元素以及确定
{
fun(a,3);
return;
}
int i;
for(i=begin;i<=12;i++)
{
if(i==12) continue;//12号元素已经确定
if(!f(a,begin)) continue;
swap(a[begin],a[i]);
fun(a,begin+1);
swap(a[begin],a[i]);//回溯
}
return;
}
if(is(a))
cout<<a[6]<<endl;
}
int main()
{
int a[13],i;
for(i=0;i<13;i++)
a[i]=i;
a[2]=8;a[12]=3;
a[8]=2;a[3]=12;
fun(a,1);
return 0;
}
2.dfs
#include <iostream>
using namespace std;
int a[13];
int flag[13];
bool f(int pos)
{
if(pos>5)
{
int x1=a[2]+a[3]+a[4]+a[5];
if(x1!=26) return false;//绝对不能构成
}
return true;
}
void dfs(int i)
{
if(i==1||i==2||i==12)
{
dfs(i+1);
return;
}
if(i<12)
{
if(!f(i)) return;
int j;
for(j=1;j<13;j++)
{
if(!flag[j])
{
flag[j]=1;
a[i]=j;
dfs(i+1);
flag[j]=0;
}
}
return;
}
int x1=a[2]+a[3]+a[4]+a[5];
int x2=a[8]+a[9]+a[10]+a[11];
int x3=a[1]+a[3]+a[6]+a[8];
int x4=a[5]+a[7]+a[10]+a[12];
int x5=a[2]+a[6]+a[9]+a[12];
int x6=a[1]+a[4]+a[7]+a[11];
if(x1==x2&&x1==x3&&x1==x4&&x1==x5&&x1==x6&&x1==26)
cout<<a[6]<<endl;
}
int main()
{
int i;
for(i=0;i<13;i++)
a[i]=flag[i]=0;
a[1]=1,a[2]=8,a[12]=3;
flag[1]=flag[8]=flag[3]=1;
dfs(1);
return 0;
}
比赛时候,我用的for,我不想说什么,比赛的时候就没想到用dfs,用递归,蛋疼,是紧张了么。。。
答案是:10