HDU 1016 Prime Ring Problem
来源:互联网 发布:练就不平凡软件 编辑:程序博客网 时间:2024/06/12 01:31
Problem : 1016 ( Prime Ring Problem ) Judge Status : Accepted
RunId : 4376328 Language : G++ Author : nasta
题意:
输入正整数n,把整数1~n组成换,是相邻两数之和均为素数。输出时从1开始逆时针排列。1<n<20
分析:
此题如果用枚举肯定超时,故可用DFS+剪枝+回溯。
网上看别人写得代码有用奇偶剪枝的,我自己试了下,对AC时间无影响、、、
#include <cstdio>#include <cmath>#define MAX 20int isp[MAX*2];int A[MAX], vis[MAX];int n;bool state = false;bool isPrime(int n){ if(n <= 1) return false; int t = (int)sqrt((float)n); for(int i=2; i <= t; ++i) if(n % i == 0) return false; return true;}void dfs(int cur){ if(cur == n && isp[A[0]+A[n-1]]) { state = true; for(int i=0; i < n; ++i) { if(i != 0) printf(" "); printf("%d", A[i]); } printf("\n"); } else for(int i=2; i<=n; ++i) { if(!vis[i] && isp[i+A[cur-1]]) { A[cur] = i; vis[i] = 1; dfs(cur+1); vis[i] = 0; } }}int main(){ for(int i=2; i < MAX*2; ++i) isp[i] = isPrime(i); int i=1; A[0]=1; while(scanf("%d", &n) != EOF) { state = false; printf("Case %d:\n", i++); dfs(1); if(!state) printf("\n"); printf("\n"); } return 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
- 网络犯罪是目前的主流
- cxf学习
- CAS单点登录(SSO)完整教程
- C++实现Structural - Composite模式
- vc6.0下如何执行桌面的宽带连接? 要代码。。。。。。
- HDU 1016 Prime Ring Problem
- Hbase简介
- greg's blog
- Android内核和驱动篇-Android内核介绍 (转)
- pku2418水题--学写AVL
- 人重要的是知耻而后勇
- xml
- 报表参数多个值的接收及存储过程解析
- java 反射 测试