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 }

 

posted @ 2021-01-10 17:15  acmloser  阅读(81)  评论(0编辑  收藏  举报