HDU 1016 Prime Ring Problem
来源:互联网 发布:员工网络和访客网络 编辑:程序博客网 时间:2024/06/06 17:29
这题我用的是DFS。不多说,看代码和注释。
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>using namespace std;
//因为n<20,所以最大的素数也就是40左右,因此用一个数组来记录45以内的素数,用于之后的判定。bool isprime[45]={0,1,1,1,0,1,0,1,0,0,0,1,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,0,1,0,1,0};int n;bool visited[24];//用于标记是否被访问过void dfs(int cnt,int id,int ans[]){ if(cnt==n+1) { printf("%d",ans[1]); for(int i=2;i<=n;i++) printf(" %d",ans[i]); printf("\n"); return; } for(int i=2;i<=n;i++) { if(visited[i]||i==id) continue; visited[i]=true; if(cnt==n)//这里注意要区分是不是到达第n个数,如果到达因为是圆环,所以还要判定和1相加是不是素数。 { int t1=ans[cnt-1]+i; int t2=i+1; if(isprime[t1]&&isprime[t2]) { ans[cnt]=i; dfs(cnt+1,i,ans); } } else//否则就判断和前一个数相加是不是素数 { int t=ans[cnt-1]+i; if(isprime[t]) { ans[cnt]=i; dfs(cnt+1,i,ans); } } visited[i]=false;//记得恢复 }}int main(){ int k=1; while(scanf("%d",&n)!=EOF) { int ans[25]; ans[1]=1; memset(visited,false,sizeof(visited)); visited[1]=true; printf("Case %d:\n",k++); dfs(2,1,ans); printf("\n"); } return 0;}
0 0
- hdu 1016 Prime Ring Problem
- hdu 1016 Prime Ring Problem
- hdu 1016 Prime Ring Problem
- HDU 1016 Prime Ring Problem
- hdu 1016 Prime Ring Problem
- HDU-1016 prime ring problem
- hdu 1016Prime Ring Problem
- hdu 1016 Prime Ring Problem
- HDU-1016 Prime Ring Problem
- HDU-1016-Prime Ring Problem
- hdu 1016 Prime Ring Problem
- hdu 1016 Prime Ring Problem
- hdu 1016 Prime Ring Problem
- hdu 1016 Prime Ring Problem
- Hdu 1016 Prime Ring Problem
- hdu 1016 Prime Ring Problem
- Hdu 1016 - Prime Ring Problem
- HDU 1016 Prime Ring Problem
- 黑马程序员--Java基础学习十(Java线程)
- WebKit结构简介
- C指针与字符串
- 黑马程序员——Java 网络程序设计
- 走进WebKit
- HDU 1016 Prime Ring Problem
- 数据结构课程设计《模拟客服系统》
- 算法训练 Torry的困惑(基本型)
- android有用代码片段
- [math][第二阶段-easy math][HDU-2138]How many prime numbers
- 换行符‘\n’和回车符‘\r
- [leetcode]Gas Station
- 关于bmp文件格式
- Palindrome Partitioning II