题目很简单就是输入一个数n,之后把1-n放入一个圆环中使每个数与它两边的任意一个数相加都是素数,把所有可能的排列情况输出出来。
ps:刚开始练深搜,当时对那个输出所有的可能的情况那个递归迷糊了半天。
代码:
#include<stdio.h> #include<math.h> #include<string.h> int n; int temp;//记录已经有多少个节点有数 int r[21];//记录每个节点的数的值 bool vis[21];//记录每个节点是否存在数 bool prime[40];//对40之内的数进行素数的判定,如果是素数则标记为1反之则标为0 bool judge(int n)//素数判定的函数 { int k; if(n==2) return true; else if (n==1||n==0) return false; for(k=2;k<=int(sqrt(double(n)));k++) { if(n%k==0) return false; } return true; } void DFS(int step)//step代表当前节点的数值,i表示下一节点的值 { int i,j; for(i=2;i<=n;i++) { if(!vis[i]&&prime[i+step]) { r[temp++]=i; vis[i]=true; DFS(i); vis[i]=false; temp--; } } if(temp==n+1&&prime[1+r[n]]) { for(j=1;j<=n;j++) { if(j!=1) printf(" "); printf("%d",r[j]); } printf("\n"); } } int main() { int i,k; for(i=1;i<=40;i++) { if(judge(i)) prime[i]=true; else prime[i]=false; } r[1]=1;//第一个数永远为1 temp=2;//第一个数已经确定所以从第二个数开始搜索 k=1; while(scanf("%d",&n)!=EOF) { printf("Case %d:\n",k++); memset(vis,false,sizeof(vis)); vis[1]=true; DFS(1); printf("\n"); } return 0; }