1. 程式人生 > 實用技巧 >Prime Ring Problem UVA - 524

Prime Ring Problem UVA - 524

原題連結

考察:dfs+素數

這道題在hdu和uva都有,但是相較uva,hdu的資料明顯弱了.就算改了輸出格式,相同程式碼在UVA是WA,而在HDU可以AC

當N<=16,陣列不能只開到30,因為最大是16+15=31

這道題沒怎麼想直接看了lrj老師的程式碼...下次還是要認真想啊!!!!

思路:

雖然是要判斷左右兩邊和都為素數才行,但是這道題檢查一邊就可以,因為成環狀,我們檢查a+b和檢查b+a是一樣的

 1 #include <iostream>
 2 #include <cstdio> 
 3 #include <cstring>
 4
using namespace std; 5 const int N = 35; 6 bool isP[N]; 7 int n,kcase,path[N],vis[N]; 8 void IsPrime() 9 { 10 isP[0] = isP[1] = 0; 11 for(int i=2;i<N;i++) 12 if(isP[i]) for(int j=i*2;j<N;j+=i) isP[j]=0; 13 } 14 void dfs(int u)//每個人與相鄰兩個人的數字之和為素數 15 { 16 if(u==n&&isP[path[u-1
]+path[0]]){ 17 for(int i=0;i<n;i++) printf("%d%c",path[i],(i==n-1?'\n':' ')); 18 return; 19 }else{ 20 for(int i=2;i<=n;i++){ 21 if(!vis[i]&&isP[i+path[u-1]]) 22 { 23 path[u] = i; 24 vis[i] = 1; 25 dfs(u+1
); 26 vis[i] = 0; 27 } 28 } 29 } 30 } 31 int main() 32 { 33 // freopen("in.txt","r",stdin); 34 // freopen("out.txt","w",stdout); 35 fill(isP,isP+N,1); 36 IsPrime(); 37 while(scanf("%d",&n)!=EOF) 38 { 39 if(kcase) printf("\n"); 40 fill(vis,vis+N,0); 41 printf("Case %d:\n",++kcase); 42 path[0]=1; 43 vis[1]=1; 44 dfs(1); 45 } 46 return 0; 47 }