0
点赞
收藏
分享

微信扫一扫

nyoj488&&hdu1016 素数环(DFS)



素数环

1000 ms  |  内存限制: 65535


有一个整数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>
int prime[41]={0,0,2,3,0,5,0,7,0,0,0,11,0,13,0,0,0,17,0,19,0,0,0,23,0,0,0,0,0,29,0,31,0,0,0,0,0,37,0,0,0};//先把素数打表
int t=0,n,flag,stamp[20],visit[20];
void dfs(int star)
{
if(star==2&&stamp[1]!=1)
return ;
if(star==n+1&&prime[stamp[n]+stamp[1]])
{
if(flag)
printf("Case %d:\n",t),flag=0;
for(int j=1;j<=n;j++)
printf("%d ",stamp[j]);
printf("\n");
return ;
}
for(int i=1;i<=n;i++)
{
if(!visit[i]&&prime[stamp[star-1]+i])
visit[i]=1,stamp[star]=i,dfs(star+1),visit[i]=0;
}
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
t++,flag=1;
memset(visit,0,sizeof(visit));
memset(stamp,0,sizeof(stamp));
stamp[0]=1;
if(n==1)
printf("Case %d:\n1\n",t);
else if(n%2&&n!=2)//如果n是奇数肯定不能(因为1+n是偶数了)
printf("Case %d:\nNo Answer\n",t);
else
dfs(1);
}
}



举报

相关推荐

0 条评论