nyoj 素数环

算法:搜索

描述
有一个整数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 <iostream>
#include <string>
#include <cstring>
#include <iomanip>
#include <stdio.h>
using namespace std;
int a[23],b[23],n,c[50],p;
void cmp()
{   memset(c,1,sizeof(c));
	int i,j,k;
	for(i=2;i<20;i++)
	{
		for(j=i*2;j<39;j=j+i)
		   c[j]=0;
	}
	c[0]=c[1]=0;
}
int dfs(int n,int k)
{
	if(k==n&&c[b[0]+b[n-1]])
	{
		p=1;
		for(int j=0;j<n;j++)
		{
			if(j) cout<<" ";
			cout<<b[j];
		}
		cout<<endl;
	}
	else 
	{
		for(int i=2;i<=n;i++)
		{
			if(!a[i]&&c[b[k-1]+i])
			{
				a[i]=1;
				b[k]=i;
				dfs(n,k+1);
				a[i]=0;
			}
		}
	}
}
int main()
{   int i,j=0,k;
	while(scanf("%d",&n)&&n)
	{   cmp();
	    p=0;
		memset(a,0,sizeof(a));
		b[0]=1;
		printf("Case %d:\n",++j);
		if(n%2==0||n==1)dfs(n,1);
		if(p==0) printf("No Answer\n");
	}
} 



posted @ 2015-12-29 11:02  (慎独)  阅读(190)  评论(0编辑  收藏  举报