NYOJ-488 素數環


 

素數環

時間限制: 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
 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 }

 

 
         


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM