NYOJ-488 素数环

 

素数环

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
 
描述

有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。

为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。

NYOJ-488 素数环

 
输入
有多组测试数据,每组输入一个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

 1 /* 

 2    功能Function Description:     NYOJ-488

 3    开发环境Environment:          DEV C++ 4.9.9.1

 4    技术特点Technique:

 5    版本Version:

 6    作者Author:                   可笑痴狂

 7    日期Date:                      20120815

 8    备注Notes:

 9    素数环:给定n,1~n组成一个素数环,相邻两个数的和为素数。

10     首先偶数(2例外,但是本题不会出现两个数的和为2)不是素数,

11     所以素数环里奇偶间隔。如果n是奇数,必定有两个奇数相邻的情况。

12     所以当n为奇数时,输出“No Answer”。

13     当n == 1时只1个数,算作自环,输出1

14     所有n为偶数的情况都能变成奇偶间隔的环-----所以都有结果。

15 */

16 #include<stdio.h>

17 #include<string.h>

18 

19 int prime[40]={1,1,0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,01,1,1,0,1,1};

20 int visit[21];

21 int ring[21];

22 

23 /*

24 void Is_prime()

25 {

26     int i,j;

27     prime[0]=prime[1]=1;

28     for(i=2;i<=6;++i)

29         for(j=i*i;j<40;j+=i)

30             prime[j]=1;

31 }

32 */

33 void DFS(int k,int n)

34 {

35     int i;

36     if(k==n+1&&prime[ring[n]+ring[1]]==0)

37     {

38         printf("1");

39         for(i=2;i<=n;++i)

40             printf(" %d",ring[i]);

41         printf("\n");

42         return;

43     }

44     for(i=2;i<=n;++i)

45     {

46         if(!visit[i]&&!prime[i+ring[k-1]])

47         {

48             visit[i]=1;

49             ring[k]=i;

50             DFS(k+1,n);

51             visit[i]=0;

52         }

53     }

54 }

55 

56 int main()

57 {

58     int T,n;

59     T=1;

60 //    Is_prime();

61     while(scanf("%d",&n),n)

62     {

63         printf("Case %d:\n",T++);

64         if(n==1)

65         {

66             printf("1\n");

67             continue;

68         }

69         if(n&1)

70         {

71             printf("No Answer\n");

72             continue;

73         }

74         memset(visit,0,sizeof(visit));

75         visit[1]=ring[1]=1;

76         DFS(2,n);

77     }

78     return 0;

79 }

 


你可能感兴趣的:(素数)