1. 程式人生 > 其它 >NYOJ-----素數環

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 }