杭电OJ(HDOJ)1016题:Prime Ring Problem(DFS问题)
来源:互联网 发布:淘宝网电脑版登录 编辑:程序博客网 时间:2024/06/06 16:09
题意:
输入一个数n(o<n<20),输出序列{a1,a2,a3,...an},该序列满足以下条件:ai+a(i-1)的和是素数,ai+a(i+1)的和也是素数,假设输入n=6,序列如下图所示:
注:序列的首位元素总是1。
示例输入:
6
8
示例输出:
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
解决方案:
1、一个标准的无向图的深度优先遍历(Depth First Search ,DFS),设n=6,可以表示为如下邻接矩阵。
0 1 1 1 1 1
1 0 1 1 1 1
1 1 0 1 1 1
1 1 1 0 1 1
1 1 1 1 0 1
1 1 1 1 1 0
2、满足条件:任意两个相邻结点之和必须是素数。因为n<20,所以最大输入值为19,19之前的数是18,19+18=37,所以可先将40以内的所有素数先置于一个数组primeNum[]之中,在求解过程中只须判断两个数之和是否在数组之中。
3、每个序列都是从1开始,所以一开始在每次输入n之后,在进行遍历之前,先将1置入结束存放数组primeRing[]之中,并将计数器count=1,表示数组中有了一个元素。
DFS遍历步骤:
1、从顶点i出发(此处从数字1开始)
2、访问与当前相邻的且未被访问过的结点
3、若结点存在(此处为满足两数和为素数的条件),从当前结点出发,重复步骤2,否则执行步骤4
4、回溯:沿着刚才所访问的次序和方向回溯到一个还有邻接结点且未被访问的新结点,重复步骤2。直到所有的结点都被访问。
源代码:
#include<iostream>using namespace std;int n;int count;int flagNum[20]= {0};int primeRing[20];int primeNum[12]= {2,3,5,7,11,13,17,19,23,29,31,37};bool JudgePrime(int t){ int i = 0; for(i=0; i<12; i++) { if(t==primeNum[i]) return true; } return false;}void DFS(int i){ if(count==n&&JudgePrime(primeRing[0]+primeRing[n-1])) { for(int t=0; t<n; t++) { cout<<primeRing[t]; if(t<n-1) { cout<<" "; } } cout<<endl; return ; } else { int j=0; while(j<n) { if(flagNum[j]==0&&JudgePrime(i+j+2))//若结束j未访问并且两数之和为素数 { flagNum[j]=1;//将j置为访问 primeRing[count++] = j+1;//将j放在结果序列中 DFS(j);//从j开始,新的DFS遍历 flagNum[j]=0;//回溯,将j置为未访问 count--;//j没有被访问,则primeRing中减少一个元素 } j++;//移动到时与i相邻的下一个结点 } }}int main(){ int i=0; while(cin>>n) { cout<<"Case "<<++i<<":"<<endl; count=1; flagNum[0]=1;//先将1访问,置为1,表示它已被访问 primeRing[0]=1;//先1放入数组中 DFS(0); cout<<endl; } return 0;}
- 杭电OJ(HDOJ)1016题:Prime Ring Problem(DFS问题)
- HDOJ 1016 Prime Ring Problem (DFS)
- HDOJ 1016 Prime Ring Problem(DFS)
- HDOJ 1016 Prime Ring Problem (DFS)
- Prime Ring Problem(杭电1016)(DFS)
- 杭电1016 Prime Ring Problem(DFS)
- 杭电 Prime Ring Problem 1016 DFS
- 杭电 1016 Prime Ring Problem【DFS】
- 杭电OJ 1016:Prime Ring Problem
- 杭电OJ 1016 Prime Ring Problem
- 杭电 oj 1016 Prime Ring Problem
- hdoj problem 1016 Prime Ring Problem(素数环&&素数问题+DFS(回溯法))
- 杭电OJ题 1016 Prime Ring Problem解题报告
- HDOJ 题目1016 Prime Ring Problem(搜素,dfs)
- HDOJ 1016 Prime Ring Problem(dfs+回溯)
- HDOJ-1016-Prime Ring Problem(素数环)【DFS】
- HDOJ 1016 Prime Ring Problem(DFS + STL容器)
- hdoj 1016 Prime Ring Problem 【DFS】
- oracle 函数使用
- linux命令之cut
- RTB--Real TimeBidding模式的互联网广告(实时竞价的广告投放)
- jquery学习笔记1------基础
- ubuntu执行 apt-get install出错:正在读取软件包列表... 有错误!
- 杭电OJ(HDOJ)1016题:Prime Ring Problem(DFS问题)
- linux命名之grep
- 手机毒霸去广告功能分析一:总体分析
- 第五届蓝桥杯软件类省赛真题 Java本科A 猜年龄
- linux下maven安装和eclipse下的maven插件安装
- QUST程序设计赛F题:Bash博弈
- ABAP Debugger Scripting的功能(非常强大)
- 1077. Kuchiguse (20)
- 算法第四版习题