NYOJ-----素数环

时间:2022-05-05
本文章向大家介绍NYOJ-----素数环,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

素数环

时间限制: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

来源hdu改编上传者丁国强简单的dfs.....coder:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 int save[21],ans[21],step,n;
 5 void dfs()
 6 {
 7     int i,k;
 8     if(step==n)
 9     {
10         if(ans[step-1]%2==0&&ans[step-1]!=8&&ans[step-1]!=14)
11         {
12             printf("1");
13             for( k=1;k<n;k++)
14             {
15                 printf(" %d",ans[k]);
16             }
17             /*puts("");*/
18             putchar(10);
19         }
20         return ;
21     }
22     for(i=1;i<n;i++)
23     {
24     if(save[i]!=0)
25     {
26       int temp=ans[step-1]+save[i];
27       if(temp==2||temp==3||temp==5||(temp%2!=0&&temp%3!=0&&temp%5!=0))
28       {
29        int tem=save[i];
30         ans[step++]=tem;
31         save[i]=0;
32         dfs();
33         ans[--step]=0;
34         save[i]=tem;
35       }
36     }
37     }
38 }
39 
40 int main()
41 {
42    int Case=1,i;
43    for( i=0;i<20;i++)
44     {
45         save[i]=i+1;
46     }
47    ans[0]=1;
48   while(scanf("%d",&n),n)
49   {
50 
51     step=1;
52     printf("Case %d:n",Case++);
53     if(n==1)
54     {
55         printf("1n");
56         continue;
57     }
58     if(n&1)
59         printf("No Answern");
60     else
61      dfs();
62   }
63   return 0;
64 }