素数环(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 ...
随机推荐
- php正则预查
php正则预查 // 把ing结尾的单词词根部分(即不含ing部分)找出来$str = 'hello ,when i am working , don not coming';零宽度:站在原地往前看, ...
- Redis学习笔记三:多机数据库的实现
1.复制 执行slaveof命令或者设置slaveof选项,让一个服务器去复制另外一个服务器. 旧版复制功能的实现(Redis 2.8 之前的版本) 复制功能分为同步和命令传播两个操作. 同步(syn ...
- IoC模式
1.依赖 依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖.如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它.下面看一个 ...
- header()相关
header("Content-type: text/html; charset=utf-8"); header("refresh:3;url=biaodan.php?n ...
- C 语言 homework(2)
<C语言程序设计>实验报告 学 号 160809215 姓 名 韩笑 专业.班 计科16-2班 学 期 2016-2017 第1学期 指导教师 黄俊莲 吴喆 实验地点 C区二层机房 机 器 ...
- 汉诺塔(河内塔)算法 ----C语言递归实现
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺 ...
- TP中手动加载类库
加载第三方类库,包括不符合命名规范和后缀的类库,以及没有使用 命名空间或者空间和路径不一致的类库.可手动加载. // 导入Org类库包 Library/Org/Util/Date.class.php类 ...
- Linux_VPN—pptpd构架方法
以下是由本人测试可用的pptpd构架方法 按步骤: 运行环境Centeros 6 *首先运行如下命令: cat /dev/net/tun 返回的必须是: cat: /dev/net/tun: File ...
- HDU 1503 带回朔路径的最长公共子串
http://acm.hdu.edu.cn/showproblem.php?pid=1503 这道题又WA了好几次 在裸最长公共子串基础上加了回溯功能,就是给三种状态各做一个 不同的标记.dp[n][ ...
- C# XML和实体类之间相互转换(序列化和反序列化)
我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...