寒假填空训练三1009六角幻方(DFS+提前剪枝)

六角幻方


    把 1 2 3 ... 19 共19个整数排列成六角形状,如下:


    * * *
   * * * *
  * * * * *
   * * * * 
    * * *


    要求每个直线上的数字之和必须相等。共有15条直线哦!


    再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见图【p1.png】,黄色一行为所求。


    请你填写出中间一行的5个数字。数字间用空格分开。


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



9 6 5 2 16

思路:用DFS ,提前判断(剪枝) 来减少运行时间,在这里我是把15条线全都列出来

#include<iostream>
using namespace std;
int a[17]={0};
bool visit[20]={false};
void dfs(int m)
{
	int k;
	if(m==5)//表示已经搜索完 a[0-4]
	{
		k=15+13+a[0];//用来记录每条线相等的那个值
		if(k!=a[1]+a[2]+a[3]+a[4])
			return ;	  
	}
	if(m==6)
	{
		k=15+13+a[0];
		if(k!=15+a[1]+a[5])
			return ;
	}
	if(m==10)
	{
		k=15+13+a[0];
		if(k!=a[0]+a[4]+a[9]||k!=a[5]+a[6]+a[7]+a[8]+a[9]) //必须得全都 相等,只要有一个不相等就退出 
			return ;	
	}
	if(m==15)
	{
		k=15+13+a[0];
		if(k!=13+a[2]+a[6]+a[10]||k!=a[0]+a[3]+a[7]+a[11]+a[14]||k!=13+a[3]+a[8]+a[13]
		||k!=a[10]+a[11]+a[12]+a[13])
		return ;	
	}
	if(m==17)
	{
		k=15+13+a[0];
		if(k!=a[14]+a[15]+a[16]||k!=a[4]+a[8]+a[12]+a[15]||k!=a[9]+a[13]+a[16]
		||k!=15+a[2]+a[7]+a[12]+a[16]||k!=a[1]+a[6]+a[11]+a[15]
		||k!=a[5]+a[10]+a[14])
			return ; 
	else 
		for(int i=0;i<17;i++)
			cout<<a[i]<<" ";
	}
	else for(int i=1;i<=19;i++)
		{
			if(!visit[i])
			{
				a[m]=i;
				visit[i]=true;
				dfs(m+1);
				visit[i]=false;
			}
		}	
}
int main()
{
	visit[13]=true;
	visit[15]=true;
	dfs(0);
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值