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为反质数.例如,整数 ...
随机推荐
- 嵌入式Linux下BOA网页server的移植
**************************************************************************************************** ...
- DOM解析XML文件实例
XML文件: response: <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www ...
- 【ASP.NET】怎样使用类创建公共函数,在不同ASP.NET页面间反复调用
为了降低代码冗余,应将公共函数写在类中,供不同ASP.NET页面调用. 1,先新建一个类,并在类中加入函数逻辑 namespace public_function_demo { public clas ...
- Oracle基础(五)pl/sql进阶(分页过程)
编写分页过程 通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标.怎样在java中调用等内容的学习. 1.无返回值 ...
- http协议知识整理(转)
HTTP 协议 作为web开发人员,了解一些http协议的知识很有必要.本文简单介绍了HTTP协议的知识,若有错误的地方,望大家指正. 1.HTTP协议是什么? http协议是一个应用层的协议.规定了 ...
- SOHO路由器的静态路由的不同
网络拓扑如下,其中RA与RB皆为TP-LINK家用路由器 最终在TP-LINK官网的官网上找到这么一段话 静态路由是在路由器中手工设置的固定的路由条目.我司路由器静态路由是基于ICMP重定向原理,与其 ...
- [背景分离] 识别移动物体基于高斯混合 MOG
使用很easy, frame 就是当前帧, foreground 是取得的, binary 型背景, 0.03是学习速率能够依据实际调整. cv::BackgroundSubtractorMOG ...
- HDU 1201
18岁生日 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- Android 通过系统使用NotificationListenerService 监听各种Notification的用法
NotificationListenerService是通过系统调起的服务,当有应用发起通知的时候,系统会将通知的动作和信息回调给NotificationListenerService. 在继承Not ...
- sharepoint 2013 使用powershell更改站点集配额和锁定
打开sharepoint powershell 2013,使用管理员方式打开 逐行输入下面命令: $Admin = new-object Microsoft.SharePoint.Administr ...