HDU-#1016 Prime Ring Problem(DFS+回溯)
来源:互联网 发布:java判断年份月份 编辑:程序博客网 时间:2024/05/30 23:50
题目大意:输入一个n,输出满足长度为n的素数环,该素数环满足相邻数之和为素数,由1~n组成。
解题思路:利用DFS进行每个位置的穷举,满足则继续下一个位置的搜索,否则则回溯。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1016
code:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 21;int n,t,A[MAXN],vis[MAXN];bool isp[MAXN];int is_prime(int x) { //判断是否是素数 for(int i = 2; i*i <= x; i++) if(x % i == 0) return 0; return 1;}void DFS(int cur){ //利用DFS进行回溯 if(cur==n && isp[A[0]+A[n-1]]){//满足则输出,注意隐含条件第一个和最后一个数的和 for(int i=0;i<n-1;i++) printf("%d ",A[i]); printf("%d\n",A[n-1]); } else for(int i=2;i<=n;i++) //测试每一个数i if(!vis[i] && isp[i+A[cur-1]]){//未被访问且与前一个数的和为素数 A[cur]=i; vis[i]=1; //访问则标记 DFS(cur+1); vis[i]=0; //回溯则清除 }}int main() { t=1; while(scanf("%d", &n)!=EOF){ for(int i = 2; i <= n*2; i++) isp[i] = is_prime(i);//生成素数表,减少后续判断时间 memset(vis,0,sizeof(vis)); A[0] = 1; printf("Case %d:\n",t++); DFS(1); printf("\n"); } return 0;}
0 0
- HDU 1016 Prime Ring Problem(DFS回溯)
- HDU-#1016 Prime Ring Problem(DFS+回溯)
- HDU 1016 Prime Ring Problem(经典DFS+回溯)
- HDU 1016 Prime Ring Problem (DFS回溯)
- hdu 1016 Prime Ring Problem(回溯)
- hdu 1016 Prime Ring Problem(DFS +回溯法)
- HDU 1016 Prime Ring Problem(DFS回溯+素数判断)
- hdu 1016 Prime Ring Problem(DFS)
- hdu 1016 Prime Ring Problem(DFS)
- HDU 1016 Prime Ring Problem (DFS)
- HDU 1016Prime Ring Problem(dfs)
- hdu 1016 Prime Ring Problem (dfs)
- HDU 1016 Prime Ring Problem(DFS)
- HDU--1016:Prime Ring Problem (DFS)
- hdu 1016 Prime Ring Problem (DFS)
- HDU 1016-Prime Ring Problem(DFS)
- hdu 1016 Prime Ring Problem(dfs)
- HDU 1016 Prime Ring Problem(dfs)
- CRITICAL:yum.cli:Config Error: Error accessing file for config file:///etc/yum.conf
- 地方和地方是规划的风格和地方官好
- 将一个sql文件在远程的数据库执行、导入其数据
- python 的strip
- 我来看海龟
- HDU-#1016 Prime Ring Problem(DFS+回溯)
- 集训日志(四): 搜索算法及其常用优化
- myeclipse安装svn插件的多种方式
- 传值、引用、传指针的试题
- 编译原理手记03-词法分析与符号表
- Linux--- 进程跟踪手段
- C#入门一(规范代码很重要)
- jdk的下载及环境变量的配置
- 黑马程序员_java高新技术之反射