nyoj 素数环

#include <stdio.h>
#include <memory.h>
#define M 21
int flag,visit[M],Prime[M+M],n,ans[M];

	
void dfs(int cur)
{
	int i,j,k;
	if(cur==n+1)
	{
		if(Prime[ans[cur-1]+1])  // 最后一个和头一个也是素数则成立 
		{
			flag=1;
			for(i=1;i<=n;i++)
			{
				printf("%d ",ans[i]);
			}
			printf("\n");
		}
		
		return;
	}
	else
	for(i=2;i<=n;i++)
	{
		if(!visit[i]&&Prime[i+ans[cur-1]]) //如果可以选 
		{                                 
			ans[cur]=i;  // 选
			visit[i]=1;   
			dfs(cur+1);
			
			
			visit[i]=0;  //不选 
			
		}
		
		
	}

}


int main()
{
	int t,i,j,k,c;
	memset(Prime,1,sizeof(Prime));
	Prime[1]=0;
	for(i=2;i<=M;i++)
	{
		if(!Prime[i]) continue;
		for(j=2;i*j<=M+M;j++)
		{
			Prime[i*j]=0;	//素数的倍数一定不是素数	
		}

	}
	c=0;
	while(scanf("%d",&n)&&n)
	{
	
		flag=0; 
		c++;
		memset(visit,0,sizeof(visit));
		visit[1]=1;
		ans[1]=1;
		printf("Case %d:\n",c);
		if(n==1)
		{
			printf("1\n");
			continue;
		}
		if(n%2==0)
		dfs(2); // n为奇数时一定有两个奇数相邻 (环形排列) 
		if(!flag) 
		printf("No Answer\n");
	}
	return 0;
}

你可能感兴趣的:(nyoj 素数环)