hdu1016 Prime Ring Problem

本文介绍了一个使用深度优先搜索(DFS)算法解决特定问题的例子。该问题要求寻找一条路径,使得路径上的节点(数字)与其前驱节点之和为素数。通过预计算素数表并利用哈希表进行快速查询,实现了一种有效的剪枝策略来减少搜索的时间复杂度。

嘿嘿,终于还是AC了,DFS

多开了几个数组,稍微加快了一点点,不然就超时了,原来,一点一点的剪枝,还是有那么一点点用滴,看代码吧

#include<iostream>
#include<queue>
using namespace std;
int prime[]={2,3,5,7,11,13,17,19,23,29,31,37};//相邻俩个数的和顶多就37,所以把其中的所有素数都直接打表了
int a[20],b[20],n;
bool hash1[40];
void init()//哈希表
{
	memset(hash1,0,sizeof(hash1));
	for(int i=0;i<12;i++)
		hash1[prime[i]]=1;
}
void dfs(int t,int cnt)
{
	b[cnt]=t;//保存路径
	if(cnt==n)
	 {
		 if(hash1[t+1])//判断是否为素数
		 {
			 for(int j=1;j<n;j++)
				 cout<<b[j]<<' ';
			cout<<t<<endl;
		 }
		 else return ;
	}
	int i=t%2==0?3:2;
	for(;i<=n;i+=2)
	{
		
		if(a[i]!=1&&hash1[t+i]==1)
		{
			a[i]=1;
			dfs(i,cnt+1);
			a[i]=0;
		}
	}
	return ;

}
int main()
{
	int flag=0;
	init();
	while(cin>>n)
	{
		flag++;
		cout<<"Case "<<flag<<":"<<endl;
		memset(a,0,sizeof(a));
		a[0]=1;
		dfs(1,1);
		cout<<endl;
	}
	return 0;
}

转载于:https://www.cnblogs.com/nanke/archive/2011/08/02/2124426.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值