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 }