如图所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
将每个位置从零开始编号,如图。即求编号为5的位置的数
首先是暴力破解
#include<cstdio>
#include<algorithm>
using namespace std;
int a[]={1,2,3,4,5,6,7,8,9,10,11,12};
int main(){
int i;
int b[10];
while(next_permutation(a,a+12)){
if(a[0]==1&&a[1]==8&&a[11]==3){
b[1]=a[0]+a[2]+a[5]+a[7];
b[2]=a[0]+a[3]+a[6]+a[10];
b[3]=a[1]+a[2]+a[3]+a[4];
b[4]=a[1]+a[5]+a[8]+a[11];
b[5]=a[4]+a[6]+a[9]+a[11];
b[6]=a[7]+a[8]+a[9]+a[10];
for(i=1;i<6;i++){
if(b[i]!=b[i+1])break;
}
if(i>=6){printf("%d",a[5]); return 0;
}
}
}
return 0;
}
然后 用dfs
#include<cstdio>
#include<algorithm>
using namespace std;
int a[15];
int v[15];//该元素是否被选中
int b[6]; //保存每一行的值
int jiancha(){
int i,j;
b[0]=a[0]+a[2]+a[5]+a[7];
b[1]=a[0]+a[3]+a[6]+a[10];
b[2]=a[1]+a[2]+a[3]+a[4];
b[3]=a[1]+a[5]+a[8]+a[11];
b[4]=a[4]+a[6]+a[9]+a[11];
b[5]=a[7]+a[8]+a[9]+a[10];
for(i=0;i<5;i++){
if(b[i]!=b[i+1])break;
}
if(i>=5){
printf("%d ",a[5]);
return 1;
}
return 0;
}
void dfs(int i){
int k;
if(i==0||i==1||i==11){
dfs(i+1);
return;
}
if(i==12){
jiancha();return;
}
for(k=1;k<=12;k++){
if(v[k]==0){
v[k]=1;
a[i]=k;
dfs(i+1);
v[k]=0;
}
}
return;
}
int main(){
a[0]=1;
a[1]=8;
a[11]=3;
v[1]=1;//表示数字1,8,3 都被选过
v[8]=1;
v[3]=1;
dfs(1);
return 0;
}