把 1 2 3 … 19 共19个整数排列成六角形状,如下:
要求每个直线上的数字之和必须相等。共有15条直线哦!
再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见图【p1.png】,黄色一行为所求。
请你填写出中间一行的5个数字。数字间用空格分开。
参考答案:
9 6 5 2 16
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int arr[30];
bool step[20];
int table[30] = {1,2,3,4,5,6,7,8,9,10,11,12,14,16,17,18,19};
void dfs(int ws)
{
if (ws == 5)
{
if ((arr[1] + arr[2] + arr[3] + arr[4])!=38)return;//判断之前出现过的直线
}
if (ws == 6)
{
if (38 != 15 + arr[1] + arr[5]) return ;
}
if (ws == 10)
{
if ( arr[5] + arr[6] + arr[7] + arr[8] + arr[9]!=38)return;
if (10 + arr[4] + arr[9]!=38) return;
}
if (ws == 11)
{
if (38 != 13 + arr[2] + arr[6] + arr[10]) return;
}
if (ws == 14)
{
if (38 != arr[10] + arr[11] + arr[12] + arr[13])return;
if (38 != 13 + arr[3] + arr[8] + arr[13]) return;
}
if (ws == 15)
{
if (38 != arr[5] + arr[10] + arr[14]) return;
if (38 != 10 + arr[3] + arr[7] + arr[11]+arr[14])return;
}
if (ws == 17)
{
if (38 != arr[14] + arr[15]+arr[16]) return;
if (38 !=15+ arr[2]+arr[7] + arr[12]+arr[16]) return;
if (38 != arr[9] + arr[13] + arr[16]) return;
//都符合条件,则打印
for (int i = 5; i < 10; i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
return;
}
for (int i = 0; i < 19; i++)
{
if (step[table[i]] == false)//没有访问过 ,1~19只能出现一次
{
step[table[i]] = true;
arr[ws] = table[i];
dfs(ws+1);
step[table[i]] = false;
}
}
}
int main()
{
step[15] = step[13] = true;
step[10]=true;//1~19每个数字都加了3次 ,一共有15行 (1+2+...+19) *3/15=38,所以每行的和是38
arr[0]=10;
dfs(1);//第二行的第一个是标记为arr[0]
return 0;
}
这题是java组的决赛题目