您的位置:首页 > 其它

hdu 1016 Prime Ring Problem

2011-10-26 12:49 316 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1016



就是简单的DFS加回溯。。

没想到这也不会超时。。。



对于素数用筛选法打表处理;



下面是AC代码:

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int b[2000];
int a[22];
int mark[22];

void Init()
{   int i,j;
	for(i=1;i<40;i++)
		b[i]=1;  
	for(i=2;i<40;i++)  
	{     
		for(j=2;j<40;j++)  
			b[i*j]=0;   
 }
}

void dfs(int n,int k)
{
	int i;
	if(k>n)
	{
		for(i=1;i<n;i++)
			printf("%d ",a[i]);
		printf("%d\n",a
);
		
	}
	else
	{
		for(i=2;i<=n;i++)
			{
				a[k]=i;
				if(k==n&&!mark[i]&&b[a[k-1]+a[k]]&&b[a[k]+a[1]])
				{
					
     				mark[i]=1;			
					dfs(n,k+1);				
					mark[i]=0;

				}
		    	if(k!=n&&!mark[i]&&b[a[k]+a[k-1]])
				{
	
					mark[i]=1;
					dfs(n,k+1);	
					mark[i]=0;

				}

			}
	}
	
}
int main()
{
	int n;
	int ca=1;
	Init();
	while(cin>>n)
	{
		printf("Case %d:\n",ca++);
		a[1]=1;
		mark[1]=1;
		memset(mark,0,sizeof(mark));
		dfs(n,2);
		printf("\n");
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: