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:
",Case++);
53     if(n==1)
54     {
55         printf("1
");
56         continue;
57     }
58     if(n&1)
59         printf("No Answer
");
60     else
61      dfs();
62   }
63   return 0;
64 }
View Code
原文地址:https://www.cnblogs.com/gongxijun/p/3366171.html