码迷,mamicode.com
首页 > 其他好文 > 详细

Uva 524 Prime Ring

时间:2016-05-29 23:07:18      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

 如果用全排列生成之后,在判断是否是素数环是会超时的,应该用回溯。

回溯的时候  首先要注意 递归边界 ,结束的时候别忘记判断最后一个和第一个元素能否成立 

还有要记得vis的使用和递归之后的清理。

 1 #include <cstdio>
 2 #include <cstring>
 3 using  namespace std;
 4 int n,p=0;
 5 int a[50+10],vis [50+10];
 6 bool isprime[50+10];
 7 void  dfs(int cur)
 8 {
 9     if(cur==n && isprime[a[n-1]+a[0]])
10     {
11         printf("%d",a[0]);
12         for(int i=1;i<n;i++)
13             printf(" %d",a[i]);
14         printf("\n");
15         return ;
16     }
17 
18     for(int i=2;i<=n;i++)
19     {
20         if(vis[i]==0 && isprime[ a[cur-1]+i ] )
21         {
22             vis[i]=1;a[cur]=i;
23             dfs(cur+1);
24             vis[i]=0;
25         }
26     }
27 }
28 int  main()
29 {
30     for(int i=0;i<=49;i++)   isprime[i]=true;
31     isprime[0]=isprime[1]=false;
32     for(int i=2;i<=7;i++)
33     {
34         if(isprime[i])
35         {
36             for(int j=i*i;j<=49;j+=i)
37             {
38                 isprime[j]=false;
39             }
40         }
41     }
42     int flag=0;
43     while(~scanf("%d",&n))
44     {
45         if(flag) printf("\n");
46         flag=1;
47 
48         printf("Case %d:\n",++p);
49         memset(vis,0,sizeof(vis));
50 
51         a[0]=1;vis[1]=1;
52         dfs(1);
53 
54     }
55     return 0;
56 }

 

Uva 524 Prime Ring

标签:

原文地址:http://www.cnblogs.com/luosuo10/p/5540660.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!