题目分析:
#include<iostream> #include<cstdio> #include<memory.h> #include<math.h> using namespace std; int a[25],vis[25],n,cnt; bool isprime(int x) { for(int i=2;i<=(int)sqrt(x+0.5);i++) if(x%i==0) return false; return true; } void DFS(int cur){ int i,j; if(cur==n+1&&isprime(a[1]+a[n])) { //printf("Case %d:\n1",cnt); // cnt++; printf("1"); for(j=2;j<=n;j++) printf(" %d",a[j]); printf("\n"); } else { for(i=2;i<=n;i++) { if(vis[i]==0&&isprime(i+a[cur-1]))//a[cur-1]不是a[cur] { vis[i]=1; a[cur]=i; DFS(cur+1); vis[i]=0; } } } } int main() { int c=1; while(scanf("%d",&n)!=EOF) { //if(c-1) printf("\n"); // if(c) printf("Case %d:\n",c++); memset(vis,0,sizeof(vis)); vis[1]=1,a[1]=1,cnt=1; if(n==1) printf("1\n"); else DFS(2); printf("\n");//PE 见鬼了!!! } return 0; } /* Problem : 1016 ( Prime Ring Problem ) Judge Status : Accepted RunId : 3644950 Language : C++ Author : zjut11018 回溯法(同八皇后问题)DFS #include<stdio.h> #include<algorithm> using namespace std; int vis[41],pri[21],c[21],n; void dfs(int cur) { if(cur==n) { if(!pri[c[cur-1]+1])//注意判断首尾相加是否是素数 { for(int i=0;i<n-1;i++) printf("%d ",c[i]); printf("%d\n",c[n-1]); } //此处不可以写return;否则就回到主函数结束dfs } else { for(int j=2;j<=n;j++) { if(!vis[j]&&!pri[c[cur-1]+j])//判断此数没用过&&是素数 { vis[j]=1;//标记 c[cur]=j;//c[]用于打印 dfs(cur+1); vis[j]=0;//清楚标记 重要!! } } } } int main() { for(int i=2;i<=40;i++) for(int j=i*2;j<=40;j+=i) pri[j]=1;//pri[]=1表示素数 int cas=0; while(scanf("%d",&n)==1) { cas++; printf("Case %d:\n",cas); memset(vis,0,sizeof(vis)); memset(c,0,sizeof(c)); c[0]=1;//注意第一个数 dfs(1); printf("\n"); } } */
/* 这个只能搜出一组解 深搜DFS....... #include<iostream> #include<cstdio> #include<memory.h> #include<math.h> using namespace std; int a[25],b[25],n,cnt; bool isprime(int x) { for(int i=2;i<=(int)sqrt(x+0.5);i++) if(x%i==0) return 0; return 1; } void DFS(int cur){ int i,j; for(i=2;i<=n;i++){ if(a[i]==0 && isprime(b[cur]+i))//是i 不是a[i] { a[i]=1,b[++cur]=i;//是i 不是a[i] if(cur==n&&isprime(b[cur]+1)) {//如果成功找到,输出 printf("Case %d:\n1",cnt); cnt++; for(j=2;j<=n;j++) printf(" %d",b[j]); printf("\n"); return; } DFS(cur); a[i]=0,cur--;//回溯 } } } int main(){ while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); a[1]=1,b[1]=1,cnt=1; DFS(1); } return 0; } */