蓝桥杯 六角幻方

把 1 2 3 ... 19 共19个整数排列成六角形状,如下:
    * * *
   * * * *
  * * * * *
   * * * * 
    * * *
    要求每个直线上的数字之和必须相等。共有15条直线哦!
    再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见图【p1.png】,黄色一行为所求。
    请你填写出中间一行的5个数字。数字间用空格分开。

    这是一行用空格分开的整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)

#include<iostream>
using namespace std;
int a[25];
int visit[25]={0};
bool dfs(int cur)
{
	if(cur==19)
	{
		for(int i=1;i<=19;i++)
		{
			if(visit[i]==0)
			{
				a[19]=i;
				break;
			}
		}
		if((a[17]+a[18]+a[19]==28+a[3])&&
		(a[17]+a[18]==a[1]+a[5]+a[10]+a[15]))
			return true;
		else
		return false;
	}	
	for(int i=1;i<=19;i++)
	{
		if(!visit[i])
		{
			visit[i]=1;
			a[cur]=i;
			if(cur<7)
			{
				if(dfs(cur+1))
					return true;
			}
			else if(cur==7)
			{
				if(28+a[3]==a[4]+a[5]+a[6]+a[7])
				{
					if(dfs(cur+1))
						return true;
				}
			}
			else if(cur<=11)
			{
				if(13+a[3]==a[4]+a[8])
				{
					if(dfs(cur+1))
						return true;
				}
			}
			else if(cur==12)
			{
				if((28+a[3]==a[8]+a[9]+a[10]+a[11]+a[12])&&
				(28+a[3]==a[3]+a[7]+a[12]))
				{
					if(dfs(cur+1))
						return true;
				}
			}
			else if(cur<=15)
			{
				if(28+a[3]==13+a[5]+a[9]+a[13])
				{
					if(dfs(cur+1))
						return true;
				}
			}
			else if(cur<=17)
			{
				if((28+a[3]==13+a[6]+a[11]+a[16])&&
				(28+a[3]==a[13]+a[14]+a[15]+a[16]))
				{
					if(dfs(cur+1))
						return true;
				}
			}
			else if(cur==18)
			{
				if((28+a[3]==a[4]+a[9]+a[14]+a[18])&&
				(28+a[3]==a[7]+a[11]+a[15]+a[18]))
				{
					if(dfs(cur+1))
						return true;
				}
			}
			visit[i]=0;
		}
	}
	return false;
}
int main()
{
	a[1]=15;
	a[2]=13;
	visit[15]=visit[13]=1;
	if(dfs(3))
	cout<<a[8]<<' '<<a[9]<<' '<<a[10]<<' '<<a[11]<<' '<<a[12]<<endl;
	else
	cout<<0<<endl;
	return 0;
}

答案:9 6 5 2 16

猜你喜欢

转载自blog.csdn.net/weixin_39787873/article/details/80245466