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;}
- HDU 1016 素数环
- hdu 1016 素数环
- hdu 1016素数环
- hdu-1016素数环
- HDU 1016 素数环
- hdu 素数环1016
- HDU 1016 素数环
- hdu 1016 dfs(素数环)
- hdu 1016 dfs素数环
- HDU-1016素数环问题
- 【dfs】hdu 1016 素数环
- HDU 1016 Prime Ring Problem 素数环
- nyoj 488&&hdu 1016 素数环【dfs】
- hdu 1016 Prime Ring Problem (素数环)
- HDU 1016素数环(深度搜索)
- hdu 1016 Prime Ring Problem 素数环
- hdu 1016 素数环 经典dfs
- HDU 1016 素数环 简单的DFS
- 模拟器内容不能横屏的解决方法
- 处理对象(1)-打印对象和toString方法
- Apache Maven 入门篇(下)
- VS2008下编译C++程序,解决找不到 stdint.h的问题方案
- HDU 2586 How far away?
- HDU 1016 素数环
- 处理对象(2)-==以及equals方法
- Fedora 18 下安装 AMP
- Photoshop用光与影表现3D立体字效果
- information about btcoin
- PE型感染病毒 —— 增加节点修改PE入口 (3)
- 64位WIN7 Office 2013 使用ENDNOTE X6的方法(亲自成功)
- Linux系统中VMware Tools 安装
- 迟来的C++总结