标题:六角填数 如图【1.png】所示六角形中,填入1~12的数字。 使得每条直线上的数字之和都相同。 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 这里的可以先求出相等的数是多少,(1+2+3+……+12)*2/6 算到等于26; 然后用 回溯法 或者 暴力搜索法就可以了 回溯法
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int check(int num[],int n)
{
if(num[n] == 8||num[n] == 3)
{
return 0;
}
for(int i = 0; i < n; i++)
{
if(num[i] == num[n])
{
return 0;
}
}
switch(n)
{
case 2: return 8+num[0]+num[1]+num[2]==26;
case 5: return 1+num[0]+num[3]+num[5]==26;
case 6: return 8+3+num[3]+num[6]==26;
case 7: return 3+num[2]+num[4]+num[7]==26;
case 8: return 1+num[1]+num[4]+num[8]==26&&num[5]+num[6]+num[7]+num[8]==26;
default:return 1;
}
return 1;
}
int main()
{
int num[10];
for(int i = 0; i < 10; i++)
{
num[i] = 1;
}
int k = 0;
while(k>=0)
{
num[k]++;
while(num[k]<=12&&!check(num,k))
{
num[k]++;
}
if(num[k]<=12&&k<9)
{
if(num[0] == 1)
{
getchar();
}
if(k==8)
{
cout << num[3] << ends;
}
else
{
k++;
}
}
else
{
num[k] = 1;
k--;
}
}
return 0;
}
暴力搜索之全排列法
#include<iostream>
#include<algorithm>
using namespace std;
//全排列
int main1()
{
int num[9] = {2,4,5,6,7,9,10,11,12};
do
{
if(8+3+num[3]+num[6]==26&&8+num[0]+num[1]+num[2]==26&&1+num[0]+num[3]+num[5]==26&&1+num[1]+num[4]+num[8]==26&&3+num[2]+num[4]+num[7]==26&&num[5]+num[6]+num[7]+num[8]==26)
{
cout << num[3]<<ends;
}
}
while(next_permutation(num,num+9));
return 0;
}
大家觉得不错的话就关注一下我吧!