HDU 1016 素数环

来源:互联网 发布:win7多重网络叠加 编辑:程序博客网 时间:2024/05/22 02:13

题目

这道题目可以算是一道简单的搜索题目,用来了解一下深度搜索(dfs)

#include <iostream>using namespace std;int prinum[]={0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1,  //用来判断相邻的两个数的和是不是素数,从0开始                0, 1, 0, 0, 0, 1,0, 1, 0, 0, 0, 1,               0, 0, 0, 0, 0, 1,0, 1, 0, 0, 0, 0,   0, 1, 0, 0};int nt,sev[25],jic(1);//nt 表示输入,sev[]用来存条件成立的数字,jic表示“Case #:”int fsee[25];      // 辅助数字有没有取重复  void dfs(int n){  if(n>=nt)   {    if(prinum[sev[n]+1]) {      for(int i=1;i<=nt;i++)       {         if(i!=1)cout<<" "; cout<<sev[i];       }       cout<<endl;  }            } for(int j=2;j<=nt;j++)     if(fsee[j]==0)      {        fsee[j]=1;//表示j这个数字用了,标记j,防止下次取到             if(prinum[sev[n]+j])               {     sev[n+1]=j;     dsf(n+1);          }        fsee[j]=0; //恢复标记,以便下一轮可以用                }    }  int main() {   sev[1]=1;  memset(fsee,0,sizeof(fsee)); //设置数组为0      while(cin>>nt)   {  cout<<"Case "<<jic++<<":"<<endl;  dfs(1);   cout<<endl;      } }


这里还有一些参考:

来自: 转载来源

这个代码比较整洁,有一定的参考价值。

#include <stdio.h>int a[39],b[21],c[21];int n;void dfs(int j){     int i;     if(j==n&&a[1+c[n]])      {             for(i=1;i<n;i++)            printf("%d ",c[i]);            printf("%d",c[n]);            printf("\n");      }       for(i=2;i<=n;i++)           if(b[i]!=0&&a[c[j]+i]==1)           {                  c[j+1]=i;                  b[i]=0;                  dfs(j+1);                  b[i]=i;           }    }int main(){    int k;    a[2]=a[3]=a[5]=a[7]=a[11]=a[13]=a[17]=a[17]=a[19]=a[23]=a[29]=a[31]=a[33]=a[37]=a[39]=1;    c[1]=1;    for(k=1;k<=20;k++)        b[k]=k;    k=1;    while(scanf("%d",&n)!=EOF)    {         printf("Case %d:\n",k++);           dfs(1);         printf("\n");                                               }    return 0;}


 

原创粉丝点击