hdu 1016 Prime Ring Problem(DFS +回溯法)

来源:互联网 发布:vb最新版 编辑:程序博客网 时间:2024/05/16 10:03

题目分析:


#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 : AcceptedRunId : 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;}*/



原创粉丝点击