hdu 1016 Prime Ring Problem
2016-03-17 21:12
417 查看
[align=left]Problem Description[/align]
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
[align=left]Input[/align]
n (0 < n < 20).
[align=left]Output[/align]
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in
lexicographical order.
You are to write a program that completes above process.
Print a blank line after each case.
[align=left]Sample Input[/align]
[align=left]Sample Output[/align]
思路:终于考完了冬季“大雪崩”的考试,现在水平也就做做基础题了,本题dfs,用筛法筛出质数然后每次dfs当前的没有被用过数和层数,当转一圈层数正好等于n时再输出,用fa[]记录每个点的父亲结点方便输出,不符合条件的dfs之后要消去访问标记。
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
[align=left]Input[/align]
n (0 < n < 20).
[align=left]Output[/align]
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in
lexicographical order.
You are to write a program that completes above process.
Print a blank line after each case.
[align=left]Sample Input[/align]
6 8
[align=left]Sample Output[/align]
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2
思路:终于考完了冬季“大雪崩”的考试,现在水平也就做做基础题了,本题dfs,用筛法筛出质数然后每次dfs当前的没有被用过数和层数,当转一圈层数正好等于n时再输出,用fa[]记录每个点的父亲结点方便输出,不符合条件的dfs之后要消去访问标记。
#include<iostream> #include<cstring> #define CLR(a,b) memset(a,b,sizeof(a)) using namespace std; const int MAXN=2e2+5; int n,phi[MAXN],ans[MAXN],fa[MAXN],vis[MAXN]; void eular(){ for(int i = 0; i<MAXN;i++) phi[i] = i; for(int i = 2; i<MAXN;i++) if(phi[i] == i) for(int j = i+i;j<MAXN;j+=i) phi[j] = 0; } void print(int cur){ int n=0; while(cur!=1){ ans[n++]=cur; cur=fa[cur]; } cout<<1; for(int i=n-1;i>=0;i--) cout<<' '<<ans[i]; cout<<endl; } void dfs(int cur,int k){ if(k==n && phi[cur+1]){ print(cur); } //cout<<cur<<' '<<k<<endl; for(int i=2;i<=n;i++){ if(phi[cur+i] && !vis[i]){ vis[i]=1; fa[i]=cur; dfs(i,k+1); vis[i]=0; } } } void init(){ CLR(ans,0);CLR(fa,0);CLR(vis,0); } int main(){ int ca=1; eular(); while(cin>>n) { cout<<"Case "<<ca++<<":"<<endl; init(); dfs(1,1); cout<<endl; } return 0; }
相关文章推荐
- redis列表键的底层实现之链表
- php常用的的全局变量
- c#Com控件开发
- 运行Dos命令并得到dos的输出文本(使用管道函数CreatePipe和PeekNamedPipe)
- Python应用与实践【转】
- Easyui Layout Center 全屏方法扩展
- iOS设置navigationBar背景透明
- PerformanceCounter 性能计数器的使用
- ios学习资料
- 搜索引擎原理 – 正排索引、倒排索引以及齐普夫法则
- Nim游戏博弈
- Bootstrap 提示框
- DRM security
- log4net
- Leetcode 38 Count and Say 传说中的递推
- PAT (Advanced Level) Practise 1063 Set Similarity (25)
- 后缀表达式求值
- ansible playbook 详解
- WIN64上一种只需修改函数6个字节的INLINE HOOK方法
- 正则表达式