素数环
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。
为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。
#include<stdio.h>
#include<string.h>
int prime[41]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0};//一时冲动就把1~40之间所有的素数标记出来了,然后因为20+19=39,所以最大的数只有39;
int n,m,flag,g=1,tag[21];
void hhh()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(tag[j]==i&&i!=n)
printf("%d ",j);
else if(tag[j]==i&&i==n)
printf("%d\n",j);
}
}
}
void dfs(int a)
{
tag[a]=m;
if(m==n&&prime[a+1]==1)
{
flag=1;
hhh();//已经找到那个环了,直接输出就好
return ;
}
for(int i=1;i<=n;i++)
{
if(tag[i]!=0)
continue;
if(prime[a+i]==1)
{
m++;
dfs(i);
m--;
tag[i]=0;
}
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
m=1;flag=0;
memset(tag,0,sizeof(tag));
printf("Case %d:\n",g++);
if(n==1)
printf("1\n");
else if(n%2==1)//如果n为奇数的话,一定没有素数环,这一步很重要,省掉会说你Time limit exceeded
printf("No Answer\n");
else
{
dfs(1);
if(flag==0)
printf("No Answer\n");
}
}
return 0;
}