题目大意:

给定1-n这n个数,组成以1开头的素数环,保证相邻两个数相加均为素数

 

题目用dfs搜索再回溯,这样碰到不成立的立刻退出递归,就减少了很多步骤,不然暴力来就是n!次复杂度,肯定是超时的

每次添入数据都要判断是否相邻数相加为素数,所以我们可以提前打个素数表,这样使自己判断素数更加方便

 

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 
 6 #define N 22
 7 int n , a[N] , visit[N] , prime[41];
 8 
 9 void prime_table()
10 {
11     memset(prime,0,sizeof(prime));
12     for(int i = 2;i<40;i++){
13         if(!prime[i]){
14             for(int j=i+i;j<40;j+=i)
15                 prime[j] = 1;
16         }
17     }
18 }
19 
20 void dfs(int x,int cnt)
21 {
22     visit[x] = 1;
23     if(cnt == n && !prime[a[0]+a[cnt-1]]){
24         printf("%d",a[0]);
25         for(int i=1;i<cnt;i++)
26             printf(" %d",a[i]);
27         printf("\n");
28     }
29 
30     for(int i=1;i<=n;i++){
31         if(!visit[i]&& !prime[a[cnt-1]+i]){
32             a[cnt] = i;
33             dfs(i,cnt+1);
34             visit[i]=0;//回溯
35         }
36     }
37 }
38 
39 int main()
40 {
41     int t = 1;
42     prime_table();
43     while(~scanf("%d",&n))
44     {
45         printf("Case %d:\n",t);
46 
47         memset(visit,0,sizeof(visit));
48         a[0] = 1;
49         dfs(1,1);
50         //这里一组数据做完记得换行,题目要求
51         printf("\n");
52         t++;
53     }
54 }

 

 posted on 2014-09-25 18:30  Love风吟  阅读(323)  评论(0编辑  收藏  举报