/*
题目描述:
如图【1.png】所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
请通过浏览器提交答案,不要填写多余的内容。
用的是深搜
*/
#include <stdio.h>
int a[13],b[13]={0},c[13];
void judge(int c[])
{
int x,y,z,w,s,t;
x=c[1]+c[3]+c[6]+c[8];
y=c[1]+c[4]+c[7]+c[11];
z=c[2]+c[3]+c[4]+c[5];
w=c[2]+c[6]+c[9]+c[12];
s=c[5]+c[7]+c[10]+c[12];
t=c[8]+c[9]+c[10]+c[11];
if(x==y&&x==z&&x==w&&x==s&&x==t&&y==z&&y==w&&y==s&&y==t&&z==w&&z==s&&z==t&&w==s&&w==t&&s==t)
{
printf("%d\n",c[6]);
}
}
void f(int df)//df是当前我已经对第几个位置已经赋好值了
{
if(df==11)// 因为我已经对c[12]赋过值了且已经对b[3]进行标记 所以 从最初开始的循环 理论上是只剩下9个数字可选
{
judge(c);//所以 递归出口应该是df恒等于11的时候
return ;
}
for(int j=1;j<=12;j++)
{
if(b[j]==1)
{
continue;//标记这个数字我是否已经用过
}
c[df+1]=a[j];
b[j]=1;
f(df+1);
b[j]=0;//一定要记得去标记
}
}
int main()
{
c[1]=1;
c[2]=8;
c[12]=3;
for(int i=1;i<=12;i++)
{
a[i]=i;
}
b[1]=1;
b[8]=1;
b[3]=1;
f(2);
}