HDU1016

题意:1-n围成一个圈,要使相邻的两个数之和为素数;

DFS 

第二道没看题解自己搜出来的题,好有成就感!!(虽然比较水吧= =

上代码咯~

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 const int dx[4]= {1,0,-1,0};
 8 const int dy[4]= {0,1,0,-1};
 9 int vis[105],prime[40],n,k1,s[10110],cas;
10 int dfs(int x,int cnt)
11 {
12     if(cnt==n&&prime[x+1])//满足条件时,输出。
13     {
14         printf("1 ");
15         for(int i=0; i<k1; i++)
16         {
17             printf("%d",s[i]);
18             if(i!=k1-1)
19             {
20                 printf(" ");
21             }
22             else
23             {
24                 printf("
");
25             }
26         }
27         x=1;//进行下面的搜索的初始化。
28         cnt=1;
29     }
30     else
31     {
32         for(int i=2; i<=n; i++)
33         {
34             if(!vis[i]&&prime[x+i])
35             {
36                 vis[i]=1;
37                 s[k1++]=i;
38                 dfs(i,cnt+1);
39                 vis[i]=0;//如果搜不到就让标记消失~
40                 k1--;
41             }
42         }
43     }
44     return 0;
45 }
46 int main()
47 {
48     memset(prime,0,sizeof(prime));//打一个素数表
49     for(int i=2; i<=40; i++)
50     {
51         int k=sqrt(i);
52         int f=0;
53         for(int j=2; j<=k; j++)
54         {
55             if(i%j==0)
56             {
57                 prime[i]=0;
58                 f=1;
59                 break;
60             }
61         }
62         if(f==0)
63         {
64             prime[i]=1;
65         }
66     }
67     cas=0;
68     while(~scanf("%d",&n))
69     {
70         cas++;
71         k1=0;
72         memset(vis,0,sizeof(vis));//每次都要初始化
73         printf("Case %d:
",cas);
74         dfs(1,1);//从一开始搜
75         printf("
");
76     }
77     return 0;
78 }
View Code
原文地址:https://www.cnblogs.com/qioalu/p/4898965.html