美丽的项链(素数环)(回溯法)
题目描述
520马上就要到了,丁丁妹在思考送自己的室友什么礼物能够彰显她深深的室友之爱。
由于丁丁妹最近沉迷于数学,于是她想出了一个绝(土)妙(味)的礼物——素数项链。
具体而言,素数项链是一个由1~n共n个数排列而成的环,环中任意相邻两个数的和都是素数,如下图就是这样的一条项链:
现在丁丁妹已经买了n个数字,就等着把它们串起来了,她希望知道,素数环一共有多少种可能的情况。
考虑到对称性,我们假设素数环的元素都是从11开始的。
输入描述
单组数据,第一行为一个正整数nn,表示素数环中元素的个数。
数据保证:0<n<20
输出描述
所有可能的素数环,按字典序从小到大输出。
样例输入
8
样例输出
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、n为奇数时,不可能构成素数环,可以简单去想一下
2、可以在构成换之前,就对相邻数字之和进行判断是否为奇数,不是可直接剪枝
3、因为题目原因,两数和最大为39,可以人工直接去完成判断是否为素数,不用for循环了,节省了非常多的时间
我的代码实现
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n;
vector<int> res(21);
vector<int> tag(21);
bool shisushu(int x)
{if(x==2||x==3||x==5||x==7||x==11||x==13||x==17||x==19||x==23||x==29||x==31||x==37)return 1;elsereturn 0;
}void dfs(int k)
{if(k>=n&&shisushu(res[0]+res[n-1])){for(int i=0; i<n; i++){printf("%d ",res[i]);}printf("\n");}else{for(int i=2; i<=n; i++){if(tag[i]==0&&shisushu(i+res[k-1])){res[k]=i;tag[i]=1;dfs(k+1);tag[i]=0;}}}
}
int main()
{cin>>n;if(n%2==1){return 0;}res[0]=1; //从1开始tag[1]=1;dfs(1);return 0;
}
美丽的项链(素数环)(回溯法)相关推荐
- 编程解决素数环问题Java_回溯法解决素数环问题java实现
素数环问题: 输入正整数n,把整数1,2,3--,n组成一个环,使得相邻两个整数之和均为素数,输出所有方案,注意同一个环应恰好输出一次.n<==16 样例输入: 6 样例输出: 1 4 3 2 ...
- java编程实现素数环_回溯法解决素数环
#include #include using namespace std;#define N 100000int isp[2 * N];int a[N];int visited[N];int is_ ...
- 素数环问题(回溯法)
素数环是一个计算机程序问题,指的是将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环. 现在要求输入一个n,求n个数围成一圈有多少种素数环,规定第一个 ...
- 质数环问题c语言,素数环问题
问题描述:将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环. n=20时,下面的序列就是一个素数环: 1 2 3 4 7 6 5 8 9 10 13 ...
- 解决回溯法 - 回溯到底是个什么东西(含有大量经典例题加详细分析)
文章目录 一 .用最通俗的话解释回溯思想: 二.经典例子 1.经典样例1:(01背包问题的回溯解法) 2. 经典样例二:N皇后问题 3. 经典样例三:油田问题 4. 经典样例四:素数环问题 5. 经典 ...
- 回溯法采用的搜索策略_17图的搜索算法之回溯法
回 溯 法 回溯算法实际是一个类似枚举的搜索尝试方法,它的主题思想是在搜索尝试中找问题的解,当不满足求解条件就"回溯"返回,尝试别的路径.回溯算法是尝试搜索算法中最为基本的一种算法 ...
- c语言素数环,回溯法——素数环C++实现
本文共928个字,预计阅读时间需要3分钟. 回溯法简介 回溯法按深度优先策略搜索问题的解空间树.首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得 ...
- 0x08算法设计与分析复习(二):算法设计策略-回溯法2
参考书籍:算法设计与分析--C++语言描述(第二版) 算法设计策略-回溯法 子集和数 问题描述 已知n个不同的正数wi(0≤i≤n−1)的集合,求该集合的所有满足条件的子集,使得每个子集中的正数之和等 ...
- DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总
DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...
最新文章
- NoSQL实现(3)——Cassandra
- 一口气发布1008种机器翻译模型,GitHub最火NLP项目大更新:涵盖140种语言组合
- 程序员,为什么如此迷茫?
- click group list in left launchpad
- OPC Client “failed to execute OPCENUM” 解决方法
- 7.16 10.19-10.22
- python---如何用Python实现iPhone X的人脸解锁功能?
- 数据预处理—8.属性归约之主成分分析(理论及python实现)
- VMware vSphere学习之手动克隆虚拟机
- Hammer.js分析(一)——基础结构
- PHP 判断变量是否定义、是否为空、是否为真
- 如何使用USB摄像头搭配Visionpro进行视觉识别
- SCM供应链管理系统对更多行业未来
- 幅频特性曲线protues_第4章 proteus 模拟电路实验与综合设计
- 互联网入口,一个正在消失的“黑洞”
- [转]SREng扫描报告分析
- python爬虫练习2:取道指成分股数据
- matlab 交互效应三维图,【MATLAB】使用MATLAB绘制心理学中的交互作用图
- java 图片与base64相互转化
- 大学计算机实验教程实验6,大学计算机实验教程.第6版