第七题
题目
六角填数
如图【1.png】所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
请通过浏览器提交答案,不要填写多余的内容。
思路分析
暴力求法:把六角星从上到下,从左到右分别编号1~12,然后利用DFS(深度遍历搜索)递归,把所有的可能都试一遍,直到满足每条直线上和相等则可得到*的解。
代码里面有两个数组a[]和vis[]。分别用来存放1~12个数和记录哪个数被使用过,已经使用过则记为 1否则记为0
这类
放数问题
都用这种相同的方法,即可解决。
相似问题->点击打开链接
代码
#include <iostream>
#include<cstring>
using namespace std;
int a[12],vis[12];//a数组记录下标位置所对应的值,vis数组记录哪些数是可用的
int b[6];
void dfs(int i){
if(i==1||i==2||i==12){//如果该数已经填过,就直接跳过搜索下一个
dfs(i+1);
return;
}
if(i>12){//判断每一行各个数之和是否相等
b[0]=a[1]+a[4]+a[7]+a[11];
b[1]=a[1]+a[3]+a[6]+a[8];
b[2]=a[2]+a[3]+a[4]+a[5];
b[3]=a[8]+a[9]+a[10]+a[11];
b[4]=a[2]+a[6]+a[9]+a[12];
b[5]=a[5]+a[7]+a[10]+a[12];
for(int j=1;j<6;j++){
if(b[j]!=b[j-1]){
return;
}
}
cout<<a[6]<<endl;
return;
}
for(int j=1;j<=12;j++){
if(vis[j]==0){//如果数j可用
a[i]=j;
vis[j]=1;//标记数j
dfs(i+1);
vis[j]=0;
}
}
}
int main(int argc, char** argv) {
memset(vis,0,sizeof(vis));
a[1]=1;vis[1]=1;
a[2]=8;vis[8]=1;
a[12]=3;vis[3]=1;
dfs(1);
return 0;
}