hdu1016 Prime Ring Problem

嘿嘿,终于还是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;
}
posted @ 2011-08-02 00:30  枕边梦  阅读(136)  评论(0编辑  收藏  举报