2014_3_第39级台阶
【难度:】
【考点:】
题目
如图【1.png】所示六角形中,填入1~12的数字。 使得每条直线上的数字之和都相同。 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
C++代码
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[] = {2,4,5,6,7,9,10,11,12};
do{
//倒三角
int line1 = 8+a[0]+a[1]+a[2];
int line2 = 8+a[3]+a[6]+3;
int line3 = a[2]+a[4]+a[7]+3;
//正三角
int line4 = 1+a[0]+a[3]+a[5];
int line5 = 1+a[1]+a[4]+a[8];
int line6 = a[5]+a[6]+a[7]+a[8];
if(line1==line2&&line1==line3&&line1==line4&&line1==line5&&line1==line6)
cout<<a[3];
}while(next_permutation(a,a+9));
return 0;
}
//递归方法
#include<iostream>
#include<algorithm>
using namespace std;
//表示填入的数
int num[9] = {0};
//表示可选择的数
int select[9] = {2,4,5,6,7,9,10,11,12};
//用于判断是否使用
int vis[13] = {0};
//保存星号的值
int ans = -1;
bool jude()
{
bool ans1 = (1+num[1]+num[4]+num[8] == 26);
bool ans2 = (1+num[0]+num[3]+num[5] == 26);
bool ans3 = (8+num[0]+num[1]+num[2] == 26);
bool ans4 = (8+num[3]+num[6]+3 == 26);
bool ans5 = (3+num[7]+num[4]+num[2] == 26);
bool ans6 = (num[5]+num[6]+num[7]+num[8] == 26);
return ans1&&ans2&&ans3&&ans4&&ans5&&ans6;
}
void dfs(int index)
{
//如果所有点设置完就进行判断
if(index==9)
{
if(jude())
{
ans = num[3];
}
return ;
}
for(int i = 0; i < 9; i++)
{
//如果该数之前用过则不可用
if(vis[select[i]])
continue;
vis[select[i]] = 1;
num[index] = select[i];
dfs(index+1);
vis[select[i]] = 0;
}
return ;
}
int main()
{
dfs(0);
cout << ans;
return 0;
}