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 }