nyist 488 素数环(搜索+回溯)
素数环
- 描写叙述
-
有一个整数n,把从1到n的数字无反复的排列成环,且使每相邻两个数(包含首尾)的和都为素数,称为素数环。
为了简便起见,我们规定每一个素数环都从1開始。比如,下图就是6的一个素数环。

- 输入
- 有多组測试数据,每组输入一个n(0<n<20),n=0表示输入结束。
- 输出
- 每组第一行输出相应的Case序号,从1開始。
假设存在满足题意叙述的素数环,从小到大输出。
否则输出No Answer。 - 例子输入
-
6
8
3
0 - 例子输出
-
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
Case 3:
No Answer - 来源
- hdu改编
- 上传者
- ACM_丁国强
- 这道题应该算是比較简单的题了,提交了好几次都是TLE,我就郁闷了。。。看来基础还是不扎实啊。。。最后用素数的哈希表最终AC了。。。先前是各种TLE,程序优化真的非常重要啊。这就是算法的魅力所在~
-
#include <stdio.h>
#include <string.h>
#define MAXN 40
int A[MAXN];
int vis[MAXN];
int n;
int isprime[40]={
0,0,1,1,0,1,0,1,0,0,
0,1,0,1,0,0,0,1,0,1,
0,0,0,1,0,0,0,0,0,1,
0,1,0,0,0,0,0,1,0,0,
};//素数的哈希表,1代表就是素数
void dfs(int cur)//搜索+回溯(回溯事实上也是依据树的深度搜索来的)
{
int i;
if(cur==n && isprime[A[0]+A[n-1]])//递归边界,对第一个和最后一个数进行測试
{
for(i=0;i<n;i++)
printf("%d ",A[i]);
printf("\n");
}
else for(i=2;i<=n;i++)//尝试放置每个数
if(!vis[i] && isprime[i+A[cur-1]])//先看这个数有没有被标记,然后看与前面的一个数的和是否为素数
{
A[cur]=i;
vis[i]=1;//标记搜索过的路径
dfs(cur+1);
vis[i]=0;//清除标记 ,回溯
}
}
int main()
{
int i,j;
int k=1;
while(scanf("%d",&n)&&n!=0)
{
memset(vis,0,sizeof(vis));//初始化vis数组
for(i=0;i<n;i++)
A[i]=i+1;
printf("Case %d:\n",k++);
if(n==1)//自成环
{
printf("1\n");
continue;
}
if(n%2!=0)//剪枝,假设n为奇数不可能成环
{
printf("No Answer\n");
continue;
}
dfs(1);
}
return 0;
}这里我应该还是钻了空子,还是不太严谨,20一类的偶数都可以成素数环,大于20就不一定了,还是有待改进啊。。
-
本来是想用筛选发筛选出素数的,各种TLE啊。。。
(感觉筛选法效率挺高的啊) -
for(i=2;i<=MAXN;i++)
{
isprime[0]=isprime[1]=1;
if(isprime[i]==0)
for(j=i+i;j<MAXN ;j+=i)
isprime[j]=1;
}还是应该多学习别人的优秀算法,学无止境啊。 多学习别人的经验
,keep moving!!!!
nyist 488 素数环(搜索+回溯)的更多相关文章
- noj算法 素数环 回溯法
描述: 把1到20这重新排列,使得排列后的序列A满足:a. 任意相邻两个数之和是素数b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的 ...
- 素数环 南阳acm488(回溯法)
素数环 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简 ...
- UVA 524 素数环 【dfs/回溯法】
Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbers ...
- 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 (素数环经典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 ...
- HDU 1016 Prime Ring Problem(素数环问题)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1016 Prime Ring Problem Time Limit: 4000/2000 MS (Jav ...
- 素数环问题[XDU1010]
Problem 1010 - 素数环问题 Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 972 Acc ...
- [BZOJ1053] [HAOI2007] 反素数ant (搜索)
Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数 ...
随机推荐
- Android消息推送(二)--基于MQTT协议实现的推送功能
国内的Android设备,不能稳定的使用Google GCM(Google Cloud Messageing)消息推送服务. 1. 国内的Android设备,基本上从操作系统底层开始就去掉了Googl ...
- Knockout应用开发指南 第十章:更多信息(完结篇)
原文:Knockout应用开发指南 第十章:更多信息(完结篇) 1 浏览器支持 Knockout在如下浏览器通过测试: Mozilla Firefox 2.0+(最新测试版本:3.6.8) Goo ...
- My97 DatePicker
支持日期以及时分秒的选择, 国人开发, 还不错! 官网: http://www.my97.net/
- POJ 1515 Street Directions
题意: 一幅无向图 将尽量多的无向边定向成有向边 使得图强连通 无向图保证是连通的且没有重边 思路: 桥必须是双向的 因此先求边双连通分量 并将桥保存在ans中 每一个双连通分量内的边一定都 ...
- 动态加载资源文件(ResourceDictionary)
原文:动态加载资源文件(ResourceDictionary) 在xaml中控件通过绑定静态资源StaticResource来获取样式Style有多种方式: 1.在项目的启动文件App中<App ...
- BZOJ 2002 HNOI2010 弹飞羊 块
标题效果,LCT解释版本:见 http://blog.csdn.net/popoqqq/article/details/38849471 如今,用一只手滑动块,并再次改写这个问题0.0 块短啊 将进入 ...
- MVC模块化架构
全面解析ASP.NET MVC模块化架构方案 什么叫架构?揭开架构神秘的面纱,无非就是:分层+模块化.任意复杂的架构,你也会发现架构师也就做了这两件事. 本文将会全面的介绍我们团队在模块化设计方面取得 ...
- C++ - Identifier not found
This is because forward declaration in C++: Compiler needs to know function prototype when functi ...
- [WebView五学习]:调试Web Apps
上一篇我们学习了([WebView学习之四]:迁移到Android4.4版本号的WebView),今天我们来继续学习. (博客地址:http://blog.csdn.net/developer_jia ...
- 关于AIX lv 4k offset问题初步了解
关于这个问题我们首先来看一下AIX的vg的3种类型: original vg 普通卷组 big vg 大卷组 scalable vg 动态的或者可扩展的卷组 如何快速区分这三组卷组呢? 通过其参数MA ...