素数环(dfs+回溯)
题目描述:
输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数。输出时从整数1开始逆时针排列并且不能重复;
例样输入:
6
例样输出:
1 4 3 2 5 6
1 6 5 2 3 4
方法1:(生成测试法,会超时)
- #include <bits/stdc++.h>
- #define MAXN 100
- using namespace std;
- int isp[MAXN], a[MAXN];
- void get_prime(void) //*****素数打表
- {
- memset(isp, , sizeof(isp));
- isp[]=isp[]=;
- for(int i=; i<MAXN; i++)
- {
- if(isp[i])
- {
- for(int j=; j*i<MAXN; j++)
- {
- isp[i*j]=;
- }
- }
- }
- }
- int main(void)
- {
- std::ios::sync_with_stdio(false),cin.tie(),cout.tie();
- get_prime();
- int n;
- cin >> n;
- for(int i=; i<n; i++)
- {
- a[i]=i+;
- }
- do
- {
- int flag=;
- for(int i=; i<n; i++) //****逐个尝试
- {
- if(!isp[a[i]+a[(i+)%n]]) //****判断合法性
- {
- flag=;
- break;
- }
- }
- if(flag) //****如果合法则输出序列
- {
- for(int i=; i<n; i++)
- {
- cout << a[i] << " ";
- }
- cout << endl;
- }
- }while(next_permutation(a+, a+n)); //***1的位置不变
- return ;
- }
方法2:(dfs+回溯)
代码:
- #include <bits/stdc++.h>
- #define MAXN 100
- using namespace std;
- int isp[MAXN], a[MAXN], vis[MAXN], n;
- void get_prime(void) //****素数打表
- {
- memset(isp, , sizeof(isp));
- isp[]=isp[]=;
- for(int i=; i<MAXN; i++)
- {
- if(isp[i])
- {
- for(int j=; i*j<MAXN; i++)
- {
- isp[i*j]=;
- }
- }
- }
- }
- void dfs(int cur)
- {
- if(cur==n && isp[a[]+a[cur-]]) //****递归边界
- {
- for(int i=; i<n; i++) //***打印合法序列
- cout << a[i] << " ";
- cout << endl;
- }
- else
- {
- for(int i=; i<n; i++) //***逐个尝试
- {
- if(!vis[i]&&isp[i+a[cur-]]) //***i没用过且满足条件
- {
- a[cur]=i; //***存储当前序列
- vis[i]=; //****标记
- dfs(cur+); //***递归
- vis[i]=; //***去除标记
- }
- }
- }
- }
- int main(void)
- {
- std::ios::sync_with_stdio(false),cin.tie(),cout.tie();
- get_prime();
- cin >> n;
- memset(vis, , sizeof(vis));
- dfs();
- return ;
- }
素数环(dfs+回溯)的更多相关文章
- UVA 524 素数环 【dfs/回溯法】
Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbers ...
- nyist 488 素数环(搜索+回溯)
素数环 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 有一个整数n,把从1到n的数字无反复的排列成环,且使每相邻两个数(包含首尾)的和都为素数,称为素数环. ...
- 【DFS】素数环问题
题目: 输入正整数n,对1-n进行排列,使得相邻两个数之和均为素数,输出时从整数1开始,逆时针排列.同一个环应恰好输出一次.n<=16 如输入: 6 输出: 1 4 3 2 5 6 1 6 5 ...
- Hdu 1016 Prime Ring Problem (素数环经典dfs)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 素数环 南阳acm488(回溯法)
素数环 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简 ...
- noj算法 素数环 回溯法
描述: 把1到20这重新排列,使得排列后的序列A满足:a. 任意相邻两个数之和是素数b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的 ...
- HDU 1016 素数环(dfs + 回溯)
嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 一道很典型的dfs+回溯: 根据题意首先进行初始化,即第一个位置为1,然后进行dfs, ...
- 素数环问题[XDU1010]
Problem 1010 - 素数环问题 Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 972 Acc ...
- HDU 1016 Prime Ring Problem(经典DFS+回溯)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
随机推荐
- CMD代码页
不同字符编码在CMD模式下会出现乱码,需要使用 chcp 代码页 命令来更改代码页显示正常. UTF-8 65001 简体中文 936 437 美国 850 多语 ...
- Mongodb——GridFS
GridFS用于存储和恢复那些超过16M(BSON文件限制)的文件. GridFS将文件分成大块,将每个大块存储为单独的文件.GridFS中限制chunk最大为256k.GridFS使用两个colle ...
- 【转载】javaAgent 参数
-javaagent 这个JVM参数是JDK 5引进的. java -help的帮助里面写道: -javaagent:<jarpath>[=<options>] load Ja ...
- js计算24点
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- gulp学习笔记2-安装
安装nodejs -> 全局安装gulp -> 项目安装gulp以及gulp插件 -> 配置gulpfile.js -> 运行任务 1.去nodejs官网安装nodejs 2. ...
- ZJOI day1总结
虽然没人看,虽然滚了大粗,但还是这样勉励一下自己.. 今年大约是进队无望了. before ZJOI 感觉自己时间很充裕,与lyx大爷一起颓颓颓.. day -3 到xj. day -2 听课.感觉洲 ...
- 除Hadoop大数据技术外,还需了解的九大技术
除Hadoop外的9个大数据技术: 1.Apache Flink 2.Apache Samza 3.Google Cloud Data Flow 4.StreamSets 5.Tensor Flow ...
- 【架构】How To Use HAProxy to Set Up MySQL Load Balancing
How To Use HAProxy to Set Up MySQL Load Balancing Dec 2, 2013 MySQL, Scaling, Server Optimization U ...
- 【leetcode】Find Peak Element
Find Peak Element A peak element is an element that is greater than its neighbors. Given an input ar ...
- 用C语言把双向链表中的两个结点交换位置,考虑各种边界问题。
用C语言把双向链表中的两个结点交换位置,考虑各种边界问题. [参考] http://blog.csdn.net/silangquan/article/details/18051675