标题:六角填数
如图【1.png】所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
请通过浏览器提交答案,不要填写多余的内容。
暴力:
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int a[13],t;
for(int i=0;i<12;i++)
a[i]=i+1;
while(next_permutation(a,a+12))
{
t=a[1]+a[2]+a[3]+a[4];
if(a[0]==1&&a[1]==8&&a[11]==3&&t==a[7]+a[8]+a[9]+a[10]&&t==a[0]+a[2]+a[5]+a[7]
&&t==a[4]+a[6]+a[9]+a[11]&&t==a[1]+a[5]+a[8]+a[11]&&t==a[0]+a[3]+a[6]+a[10])
{
cout<<a[5];
}
}
return 0;
}
总结:next_permutation(a,a+12)这个函数是全排列函数,头文件为algorithm
法二:dfs
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
int a[13];
bool vis[13];
void dfs(int k)
{
int t=a[1]+a[2]+a[3]+a[4];
if(k==12&&a[0]==1&&a[1]==8&&a[11]==3&&t==a[7]+a[8]+a[9]+a[10]&&t==a[0]+a[2]+a[5]+a[7]
&&t==a[4]+a[6]+a[9]+a[11]&&t==a[1]+a[5]+a[8]+a[11]&&t==a[0]+a[3]+a[6]+a[10])
{
cout<<a[5];
return ;
}
for(int i=1; i<=12; i++)
{
if(!vis[i])
{
vis[i]=1;
a[k]=i;
dfs(k+1);
vis[i]=0;
a[k]=0;
}
}
}
int main()
{
memset(a,0,12);///memset(a,0,sizeof(a);
memset(vis,0,12);
dfs(0);
return 0;
}
总结:多找些dfs类型的题目做,因为掌握的还不好