素数环
 
时间限制: 1000 ms | 内存限制: 65535 KB
难度:2
 
 
有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。
为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。
 
   
  
     有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。 
    
   
     输出 
    
   
     每组第一行输出对应的Case序号,从1开始。 
    
 如果存在满足题意叙述的素数环,从小到大输出。 
    
 否则输出No Answer。 
    
   
     样例输入 
    
   
6
8
3
0 
   
     样例输出 
    
   
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
Case 3:
No Answer 
#include<stdio.h>
#include<string.h>
#include<math.h>
int b[21],a[21];
int n;
int f(int x)
{
	int i;
	for(i=2;i<=sqrt(x);i++)
	{
		if(x%i==0)
			return 0;
	}
	return 1;
}
void dfs(int x)
{
	int i,j;
	if(x==n+1&&f(1+a[n]))
	{
		for(i=1;i<=n;i++)
		{
			if(i>1)
				printf(" ");
				printf("%d",a[i]);
		}
		printf("\n");
		return ;
	}
	else
	{
		for(i=2;i<=n;i++)
		{
			if(b[i]==0&&f(i+a[x-1]))
			{
				b[i]=1;
				a[x]=i;
				dfs(x+1);
				b[i]=0;
			}
		}
		return ;
	}
}
int main()
{
	int c=1;
	int i;
	while(scanf("%d",&n),n)
	{
		for(i=1;i<=n;i++)
		{
			a[i]=0;
			b[i]=0;
		}
		a[1]=b[1]=1;
		printf("Case %d:\n",c++);
		if(n&1)
		{
			if(n==1)
				printf("1\n");
			else
				printf("No Answer\n");
		}
		else
			dfs(2);
	}
	return 0;
}









