NYOJ-----素數環
阿新 • • 發佈:2022-05-05
素數環
時間限制: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 }