六角幻方 蓝桥试题

把 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组的决赛题目

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值