解题思路:

题目是一道很典型的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//

代码如下:

C语言: 高亮代码由发芽网提供
01 #include<stdio.h>
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相关推荐

  1. 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 ...

  2. HDU1016 Prime Ring Problem dfs+回溯

    点击打开链接 Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  3. UVA524 素数环 Prime Ring Problem

    UVA524 素数环 Prime Ring Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/UVA52 ...

  4. UVA - 524:Prime Ring Problem

    Prime Ring Problem 来源:UVA 题目 A ring is composed of n (even number) circles as shown in diagram. Put ...

  5. UVA - 524 Prime Ring Problem

    题目链接: UVA - 524 Prime Ring Problem Description(素数环) A ring is composed of n (even number) circles as ...

  6. [HDOJ1016]Prime Ring Problem

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 原题: A ring is compose of n circles as shown in d ...

  7. 【ACM】杭电1022:Train Problem I

    分析: 明显是一个栈的问题.利用栈后进先出的特点模拟火车进站出站的过程即可轻松解决. 我的思路是: 用2个字符数组保存火车车厢的序列.首先比较出站后(记为s2)数组和出站前 (记为s1)数组的第一个元 ...

  8. hdu 1016 Prime Ring Problem(DFS)

    本题链接:点击打开链接 本题大意: 输入一个数n表示须要查找的数有n个,而且这些数连成一个环,随意两个相邻的数之和都为素数. 解题思路: 就是从1開始对每一个点进行查找,符合条件的点就存到一个数组中, ...

  9. HDU-1016 Prime Ring Problem DFS

    简单DFS,需要注意的是最后的那个数加上一要是个素数. 代码如下: #include <cstring> #include <cstdlib> #include <cst ...

最新文章

  1. Windows Live Writer 测试日志
  2. STM32单片机工作日记
  3. kmeans算法_实战 | KMeans 聚类算法
  4. 「软件项目管理」成本估算模型——Walston-Felix模型和COCOMO Ⅱ模型
  5. IntentService的使用介绍
  6. 计算机应用培训课程安排表,计算机培训教学计划
  7. django 定制admin
  8. 计算机院校考研非歧视,2021考研昌吉学院学科教学(语文)045103调剂信息
  9. 计算两个日期之间的时间差(毫秒数)
  10. linux闹钟命令,Linux基础命令一
  11. 什么是堆?什么是方法区?JVM内存模型中堆与方法区的介绍
  12. VUE微信开放平台实现网站微信登陆
  13. minimum在java中的意思_Java Calendar getMinimum()方法与示例
  14. 陶森大学计算机专业收入水平,2016PayScale美国大学计算机专业本科毕业生薪酬排名...
  15. JMS之——ActiveMQ消息持久化
  16. 激光测距仪全国产化电子元件推荐方案
  17. IEEE802.11规定了多种WLAN通信标准,其中(61)与其他标准采用的频段不同,因而不能兼容。【答案】A
  18. 智能门铃中可视对讲的回音消除
  19. Java技术积累递归调用——解析树的基本实现原理
  20. oracle sql 分区查询语句_ORALCE常识及SQL基本语法

热门文章

  1. 这几款免费的思维导图软件你或许没用过,快来试试吧
  2. 化工厂中用计算机系统控制物料比,2015河南省全国计算机等级考试二级笔试试卷VB考资料...
  3. 前端入门知识整理(1)Vscode使用
  4. E005 如何把Excel数据写入Word生成工资字条
  5. 实测,so easy的数据管理!
  6. VMware虚拟机之安装VMware虚拟机平台
  7. Word如何设置页码?3个简单方法快速设置!
  8. CSS水平、垂直布局、盒子
  9. plsa matlab实现
  10. 破解入门(四)-----实战单步跟踪法脱壳