六角填数
如图所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
方法一:运用c++函数
#include<iostream>
#include <algorithm>
#include<cstdio>
using namespace std;
void panduan(int a[])
{
int a1[6];
a1[0]=8+a[6]+a[7]+a[8];
a1[1]=8+a[4]+a[1]+3;
a1[2]=a[8]+a[5]+a[2]+3;
a1[3]=1+a[6]+a[4]+a[0];
a1[4]=1+a[7]+a[5]+a[3];
a1[5]=a[0]+a[1]+a[2]+a[3];
int j;
// for(j=0;j<9;j++)
//cout<<a[j];cout<<endl;return;
for(j=0;j<5;j++)
{
if(a1[j]!=a1[j+1])
return;
}
cout<<a[4]<<endl;
}
int main()
{
int a[]={2,4,5,6,7,9,10,11,12};int j=0;
panduan(a);
while(next_permutation(a,a+9))///此函数有几个就加几,但不包括第一个案例
{
panduan(a);
}
return 0;
}
方法二:递归一
#include<iostream>
#include<algorithm>
using namespace std;
void panduan(int a[],int n)
{
if(n>=9)
{ int a1[6];
a1[0]=8+a[6]+a[7]+a[8];
a1[1]=8+a[4]+a[1]+3;
a1[2]=a[8]+a[5]+a[2]+3;
a1[3]=1+a[6]+a[4]+a[0];
a1[4]=1+a[7]+a[5]+a[3];
a1[5]=a[0]+a[1]+a[2]+a[3];
int j;
for(j=0;j<5;j++)
{
if(a1[j]!=a1[j+1])
return;
}
cout<<a[4]<<endl;
}
int t,j;
for(j=n;j<9;j++)//允许j取最后一个变量,n+1那种情况,虽然能使n取到9,但并不会改变原来数组情况
{
t=a[n];a[n]=a[j];a[j]=t;//置换数据时曾写错过
panduan(a,n+1);
t=a[n];a[n]=a[j];a[j]=t;
}
}
int main()
{
int a[]={2,4,5,6,7,9,10,11,12};
panduan(a,0);
return 0;
}
方法二:递归二
#include<stdio.h>
#include<string.h>
int a[12],vis[12];
void dfs(int x)
{int i;
if(x==9||x==10||x==11)///起占位作用,避免修改a[9],a[10],a[11]
///中的内容
{dfs(x+1);
}
if(x>11)///满足边界条件则输出
{
int a1[6];
a1[0]=a[10]+a[6]+a[7]+a[8];
a1[1]=a[10]+a[4]+a[1]+a[11];
a1[2]=a[8]+a[5]+a[2]+a[11];
a1[3]=a[9]+a[6]+a[4]+a[0];
a1[4]=a[9]+a[7]+a[5]+a[3];
a1[5]=a[0]+a[1]+a[2]+a[3];
for(i=0;i<5;i++)
{
if(a1[i]!=a[i+1])
return;
}
printf("%d",a[4]);
}
for(i=1;i<12;i++)///让每个空遍历除已遍历数据的所有数据
{
if(!vis[i])///
{
a[x]=i;
vis[x]=1;
dfs(x+1);
vis[x]=0;
}
}
}
int main()
{
vis[9]=1;
vis[10]=1;
vis[11]=1;
a[9]=1;
a[10]=8;
a[11]=3;
dfs(0);
return 0;
}