素数环

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

NYOJ-----素数环_搜索专题NYOJ-----素数环_#include_02

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("1\n");
56 continue;
57 }
58 if(n&1)
59 printf("No Answer\n");
60 else
61 dfs();
62 }
63 return 0;
64 }

View Code



编程是一种快乐,享受代码带给我的乐趣!!!