ACM_素数环(dfs)
Problem Description:
如图所示,环由n个圆组成。 将自然数1,2,...,n分别放入每个圆中,并且两个相邻圆中的数字总和应为素数。
注意:第一个圆圈的数量应该始终为1。

Input:
n (0 < n < 20).
Output:
输出格式如下所示。 每行代表从1开始顺时针和逆时针旋转的一系列圆圈数字。 数字的顺序必须符合上述要求。 按照字典顺序打印解决方案。
你要编写一个完成上述过程的程序。
即使没有答案,也会在每个案例后打印一个空行。
Sample Input:
6
8
Sample Output:
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
解题思路:dfs。先打表记录40以内是素数的数组isp,因为相邻数之和有可能最大为39,所以只需枚举到39。关于字典序输出,这里每枚举到当前这个数,从2开始到n枚举哪些数是满足条件,有的话就将当前这个数记录在path数组中,并且标记这个数已经被访问,再递归下去寻找下一个数,如果递归不满足条件的话,将当前这个数置为0。每当cur==n时就输出当前素数环。其中有一个剪枝的操作,如果给定的整数n为奇数,那么肯定不存在素数环,(因为肯定存在两个奇数相邻,而奇数与奇数的和为偶数,所以一定不是素数环)这个节省了不少递归时间,不然老是TLE-_-||。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,isp[]={},vis[],path[];//vis数组是保存标记,path是记录
int is_prime(int t)//判断素数
{
for(int i=;i*i<=t;++i)
if(t%i==)return ;
return ;
}
void dfs(int cur)
{
if((cur==n) && isp[path[]+path[n]]){//递归边界 如果cur==n && isp(1+path[n])是素数,则终止条件
for(int i=;i<n;i++)
cout<<path[i]<<' ';
cout<<path[n]<<endl;
return ;
}
else{
for(int i=;i<=n;++i){//尝试放置每个数i
if(!vis[i] && isp[i+path[cur]]){ //如果i没用过
path[cur+]=i;//且i加上与之相邻的上一个数之和是素数,则把它赋给path[cur+1];
vis[i]=; //设置使用标志
dfs(cur+); //深搜
vis[i]=; //清除标志
}
}
}
}
int main()
{
for(int i=;i<;++i) //生成素数表,枚举到最大的2倍即可
isp[i]=is_prime(i);
int k=; //Case情况数
while(cin>>n){
cout<<"Case "<<k++<<':'<<endl;
memset(vis,,sizeof(vis));
vis[]=,path[]=;//将1作为path开头,且标记已访问
if(n> && (n%==))dfs();//剪枝,如果是偶数的话,必有素数环,从1开始深搜
cout<<endl;
}
return ;
}
ACM_素数环(dfs)的更多相关文章
- Hdu 1016 Prime Ring Problem (素数环经典dfs)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 【DFS】素数环问题
题目: 输入正整数n,对1-n进行排列,使得相邻两个数之和均为素数,输出时从整数1开始,逆时针排列.同一个环应恰好输出一次.n<=16 如输入: 6 输出: 1 4 3 2 5 6 1 6 5 ...
- 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的数字无反复的排列成环,且使每相邻两个数(包含首尾)的和都为素数,称为素数环. ...
- 素数环问题[XDU1010]
Problem 1010 - 素数环问题 Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 972 Acc ...
- Prime Ring Problem + nyoj 素数环 + Oil Deposits + Red and Black
Prime Ring Problem Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) ...
- HDU 1016 Prime Ring Problem(素数环问题)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1016 Prime Ring Problem Time Limit: 4000/2000 MS (Jav ...
- 素数环 南阳acm488(回溯法)
素数环 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简 ...
- HDU1016 素数环---(dfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1016 Sample Input 6 8 Sample Output Case 1: 1 4 3 2 5 6 ...
- hdu1016 Prime Ring Problem【素数环问题(经典dfs)】
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
随机推荐
- HDU 1201 18岁生日 【日期】
18岁生日 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- Unity 3D 中动态字体的创建
原创不易,转载请注明转自: http://blog.csdn.net/u012413679/article/details/26232453 ---- kosion 1.载入NGUI插件包,载入完毕后 ...
- MYSQL将时间格式化
SELECT *,DATE_FORMAT(FROM_UNIXTIME(createtime), "%Y/%m/%d %H:%i:%s") AS dateFormat FROM `I ...
- Redis入门教程(三)— Java中操作Redis
在Redis的官网上,我们可以看到Redis的Java客户端众多 其中,Jedis是Redis官方推荐,也是使用用户最多的Java客户端. 开始前的准备 使用jedis使用到的jedis-2.1.0. ...
- 19-6/24作业: 将一个double类型的小数,按照四舍五入保留两位小数
☞要求 将一个double类型的小数,按照四舍五入保留两位小数 ☞实现方式 1.获得一个double类型的小数 2.使用BigDecimal包的setScale进行操作 3.输出结果 ☞代码内容 pa ...
- JavaScript基本类型与引用类型(二)
前文已经对基本类型和引用类型作了简单的介绍,本文将进一步介绍基本类型和引用类型. 基本包装类型 为了方便操作基本类型的值,JavaScript提供了特殊的引用类型:Boolean.Number.Str ...
- 转载 Url编码
http://www.cnblogs.com/artwl/archive/2012/03/07/2382848.html 混乱的URI编码 JavaScript中编码有三种方法:escape.enco ...
- struts2的一些小问题
1.action和ValueStack的关系2.ValueStack的类set()方法和setValue()方法的区别3.ValueStack的类push()方法的作用4.从ValueStack对象中 ...
- GrideView(三)---编辑功能实现
GrideView(三)---编辑 法一.(优势:操作数据更加灵活:劣势: 书写较多代码,开发效率低) 通过编辑列---添加超链接(HyperlinkField)字段 ,来跳转页面实现编辑操作: 步骤 ...
- [Codeforces 839C] Journey
[题目链接] http://codeforces.com/contest/839/problem/C [算法] 概率DP 时间复杂度 : O(N) [代码] #include<bits/stdc ...