杭电 Prime Ring Problem
解题思路:
题目是一道很典型的dfs搜索题目,思路很清晰,很容易想到。想组成这个素数环,要有n步,而每步都有n-i(i是变动的)种可能,所以利用dfs深搜,并融合回溯法,这一步搜不到的话既返回至上一步进行。因为一点不能同时选择两次,所以要用标记这个点已经被选中,如果这一步搜索失败,那么要把这一步所标记的定点都复原,才能返回上一步进行搜索。
我没有在dfs里面直接判断素数,因为我觉得那样程序会慢,所以编写了一个求素数的函数,这样单独处理也可以防止乘法溢出的现象。另外要提到的是,搜索终止条件出了要搜索的补数达到要求以外,最后一个搜到的和第一个也要同时比较。
ps:最近一直在做 搜索,感觉剪枝是比较重要的,虽然这道题没有用上,但是必须要有剪枝的思想,不然和暴力没什么区别,题目只要不是水题,都不会过的。
//题目链接:http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1004&ojid=0&cid=4532&hide=0//
代码如下:
02 #include<string.h>
03 #include<math.h>
04 int n,vis1=1;
05 int count=2;
06 bool vis[20];
07 int primecircle[20];
08 int num[20];
09 int is_prime(int x)
10 {
11 int i;
12 int m;
13 m=floor(sqrt(x+0.5));
14 for(i=2;i<=m;i++)
15 {
16 if(x%i==0)
17 return 0;
18 }
19 return 1;
20 }
21 void dfs(int k)
22 {
23 int i;
24 int flag=0;
25 if(k==n&&is_prime(primecircle[k]+primecircle[1]))
26 {
27 vis1=1;
28 for(int j=1;j<=n;j++)
29 {
30 if(vis1)
31 {
32 printf("%d",primecircle[j]);
33 vis1=0;
34 }
35 else
36 printf(" %d",primecircle[j]);
37 }
38 printf("\n");
39 }
40 else
41 for(i=1;i<n;i++)
42 {
43 //if(((k+num[i])%2!=0)&&(vis[i]==1))
44 flag=is_prime(primecircle[k]+num[i]);
45 if(flag==1&&vis[i]==1)
46 {
47 //vis[k]=0;
48 vis[i]=0;
49 primecircle[count++]=num[i];
50 dfs(k+1);
51 //vis[k]=1;
52 vis[i]=1;
53 count--;
54
55 }
56 }
57 }
58 int main()
59 {
60 int xuran=1;
61 int i,j,k;
62 int temp;
63 primecircle[1]=1;
64 while(scanf("%d",&n)!=EOF)
65 {
66 memset(vis,1,sizeof(vis));
67 temp=1;
68 for(j=0;j<n;j++)
69 {
70 num[j]=temp++;
71 }
72 printf("Case %d:",xuran);
73 printf("\n");
74 dfs(1);
75 printf("\n");
76 xuran++;
77 }
78 return 0;
79 }
杭电 Prime Ring Problem相关推荐
- HDOJ 1016 HDU 1016 Prime Ring Problem ACM 1016 IN HDU
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1016 题目描述: Prime Ring Problem Time Limit: 4000/2000 ...
- HDU1016 Prime Ring Problem dfs+回溯
点击打开链接 Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- UVA524 素数环 Prime Ring Problem
UVA524 素数环 Prime Ring Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/UVA52 ...
- UVA - 524:Prime Ring Problem
Prime Ring Problem 来源:UVA 题目 A ring is composed of n (even number) circles as shown in diagram. Put ...
- UVA - 524 Prime Ring Problem
题目链接: UVA - 524 Prime Ring Problem Description(素数环) A ring is composed of n (even number) circles as ...
- [HDOJ1016]Prime Ring Problem
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 原题: A ring is compose of n circles as shown in d ...
- 【ACM】杭电1022:Train Problem I
分析: 明显是一个栈的问题.利用栈后进先出的特点模拟火车进站出站的过程即可轻松解决. 我的思路是: 用2个字符数组保存火车车厢的序列.首先比较出站后(记为s2)数组和出站前 (记为s1)数组的第一个元 ...
- hdu 1016 Prime Ring Problem(DFS)
本题链接:点击打开链接 本题大意: 输入一个数n表示须要查找的数有n个,而且这些数连成一个环,随意两个相邻的数之和都为素数. 解题思路: 就是从1開始对每一个点进行查找,符合条件的点就存到一个数组中, ...
- HDU-1016 Prime Ring Problem DFS
简单DFS,需要注意的是最后的那个数加上一要是个素数. 代码如下: #include <cstring> #include <cstdlib> #include <cst ...
最新文章
- Windows Live Writer 测试日志
- STM32单片机工作日记
- kmeans算法_实战 | KMeans 聚类算法
- 「软件项目管理」成本估算模型——Walston-Felix模型和COCOMO Ⅱ模型
- IntentService的使用介绍
- 计算机应用培训课程安排表,计算机培训教学计划
- django 定制admin
- 计算机院校考研非歧视,2021考研昌吉学院学科教学(语文)045103调剂信息
- 计算两个日期之间的时间差(毫秒数)
- linux闹钟命令,Linux基础命令一
- 什么是堆?什么是方法区?JVM内存模型中堆与方法区的介绍
- VUE微信开放平台实现网站微信登陆
- minimum在java中的意思_Java Calendar getMinimum()方法与示例
- 陶森大学计算机专业收入水平,2016PayScale美国大学计算机专业本科毕业生薪酬排名...
- JMS之——ActiveMQ消息持久化
- 激光测距仪全国产化电子元件推荐方案
- IEEE802.11规定了多种WLAN通信标准,其中(61)与其他标准采用的频段不同,因而不能兼容。【答案】A
- 智能门铃中可视对讲的回音消除
- Java技术积累递归调用——解析树的基本实现原理
- oracle sql 分区查询语句_ORALCE常识及SQL基本语法