HDOJ1016 搜索题(DFS)

题目链接

题目大意:给你一个数n,让你找到从1到n的序列,使相邻的两项相加的和是素数(包括第一个数和最后一个数的和)。

经典的DFS题!

dfs(int k,int now)  //k表示递归的深度,now表示已生成序列的末尾数。

贴代码了:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 
 5 using namespace std;
 6 
 7 int ans[25];
 8 int f[25];
 9 int n;
10 
11 int isprime(int x)
12 {
13     for(int i=2;i<=x/2;i++)
14     {
15             if(x%i==0)
16                       return 0;
17     }
18     return 1;
19 }
20 
21 void dfs(int k,int now)
22 {
23     if(k==n)
24     {
25             if(isprime(now+1))
26             {
27                               ans[k]=now;
28                               for(int i=0;i<n;i++)
29                               {
30                                       printf("%d%c",ans[i],i==n-1?'\n':' ');
31                               }
32             }
33             return;
34     }
35     for(int i=2;i<=n;i++)
36     {
37             if(!f[i]&&isprime(now+i))
38             {
39                                      f[i]=1;
40                                      ans[k]=i;
41                                      dfs(k+1,i);
42                                      f[i]=0;
43             }
44     }
45 }
46 
47 int main()
48 {
49     int ncas=1;
50     while(scanf("%d",&n)!=EOF)
51     {
52                               printf("Case %d:\n",ncas++);
53                               memset(f,0,sizeof(f));
54                               ans[0]=1;
55                               dfs(1,1);
56                               putchar('\n');
57     }
58     return 0;
59 }
posted @ 2012-09-19 18:40  Amazing_Y  阅读(1168)  评论(0编辑  收藏  举报