题目

输入正整数,把整数1,2,3,···,n组成一个环,使得相邻两个整数之和均为素数。输出时从整数1开始逆时针排列。同一个环应恰好输出一次。n<=16
样例输入
6
样例输出
1 4 3 2 5 6
1 6 5 2 3 4

分析与解答

用一个数组a存答案,由于是从1开始,a[0]=1,

void DFS ( Vertex V )
{visited[ V ] = true;if(…) return;for ( V 的每个邻接点 W )if ( !visited[ W ] )DFS( W );
}

在这个题中,深搜需要的终止条件,l==n&&isp[A[0]+A[n-1]],l是位置,如果已确定了n个位置,说明此时终止,并且如果第一个a[0]等于a[n-1]说明此时终止,终止的话,从0到n-1输出即可
如果不满足终止条件,我们就找新的数填到位置l,然后递归找下一个位置需要填的数,如何知道该位置填什么数?我们知道第一个数是1,那这个位置的数我们假设是2到n中任一个,循环,如果满足这个数不曾出现而且和上一个位置的数之和为素数,那我们就把这个位置填上这个数,把标记数组标记用来表明这个数已经被用过,并且递归调用找下个位置,我们递归完了还要清除标记数组的标记,就像是找到了一个可能情况,就不断地回溯一样,这样的话最终会找出所有情况

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int is_prime(int x) {for(int i = 2; i*i <= x; i++)if(x % i == 0) return 0;return 1;
}int n, A[50], isp[50], vis[50];void dfs(int l){if(l==n&&isp[A[0]+A[n-1]]){for(int i=0;i<n;++i)if(i==0) printf("%d",A[i]);else printf(" %d",A[i]);printf("\n");}else{for(int i=2;i<=n;++i)if(!vis[i]&&isp[i+A[l-1]]){A[l]=i;vis[i]=1;dfs(l+1);vis[i]=0;}}
}
int main() {int kase = 0;for(int i = 2; i <= 20*2; i++) isp[i] = is_prime(i);while(scanf("%d", &n) == 1 && n > 0) {printf("Case %d:\n", ++kase);memset(vis, 0, sizeof(vis));A[0] = 1;dfs(1);printf("\n");}return 0;
}

(回溯Uva524)素数环相关推荐

  1. UVA524 素数环 Prime Ring Problem

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

  2. c语言素数环,回溯法——素数环C++实现

    本文共928个字,预计阅读时间需要3分钟. 回溯法简介 回溯法按深度优先策略搜索问题的解空间树.首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得 ...

  3. 素数环-dfs回溯+二维数组记录(c++实现)

    问题描述: 给你n(2<=n<=16)个正整数1,2,3-n,你的任务是把这n个正整数组成一个环,使得任意相邻的两个整数之和为一个素数,输出有多少种合法方案. 输入 多组输入数据,每组数据 ...

  4. HDOJ1016 素数环(DFS)

    题目: 1016 Prime Ring Problem 1 /* 2 素数环(顺时针逆时针)---dfs 3 使用栈 4 1-n(n最大是20,相邻最大和39,素数范围2-39之间) 5 2-39间的 ...

  5. 素数环(nyoj488)

    素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起 ...

  6. CCF NOI1153 素数环

    问题链接:CCF NOI1153 素数环. 时间限制: 1000 ms  空间限制: 262144 KB 题目描述 输入n(2<=n<=20),把1到n这n个数摆成一个环,要求相邻的两个数 ...

  7. UVA524 PrimeRingProblem素数环

    输入正整数n,把整数1,2,3,···n组成一个环,使得相邻两个整数之和均为素数.输出时从整数1开始逆时针排列.同一个环应恰好输出一次.n16. 回溯法 #include<iostream> ...

  8. ACM:回溯,八皇后问题,素数环

    (一)八皇后问题 (1)回溯 #include <iostream> #include <string>#define MAXN 100using namespace std; ...

  9. java编程实现素数环_回溯法解决素数环

    #include #include using namespace std;#define N 100000int isp[2 * N];int a[N];int visited[N];int is_ ...

最新文章

  1. 配置Cesium编译环境
  2. 计算机应用基础2010备课,《计算机应用基础》教案——office2010版-(2)
  3. java字符串的用法_Java字符串的重要方法的使用实例
  4. Node --- Basic认证
  5. 简述python解释器的作用_什么是python解释器?
  6. 优化自定义函数_Pandas常见的性能优化方法
  7. 算法笔记_072:N皇后问题(Java)
  8. 那些有实力进入 BAT 的本科生,都做对了什么事?
  9. 编码转换的php小脚本,php编码转换小例子
  10. JDK 安装 Java环境变量配置 详细教程
  11. html简单网页代码
  12. android截图保存在哪,电脑f12截屏一般保存在什么位置 | 手游网游页游攻略大全...
  13. linux中的man命令总结
  14. 日期格式不一致问题处理
  15. 玩客云快速入门刷机相关教程
  16. 生产者消费者模型问题
  17. Android获取联系人权限
  18. MAC下配置芯片为CH340T的USB转串口接口的注意事项
  19. 直播“CoSoLoMo”战略是地方电视台重大历史机遇
  20. 软件的MSDN版、OEM版、RTM版有什么不同?

热门文章

  1. Oracle数据库ORA-12514错误的解决办法
  2. 数据结构pta选择判断复习
  3. python爬虫 asyncio aiohttp aiofiles 单线程多任务异步协程爬取图片
  4. LeetCode——LCP 06.拿硬币
  5. 子网划分,主机号,网络号计算
  6. lamda获取参数集合去空_(转)Java8使用lambda表达式进行集合的遍历
  7. android 软键盘遮住按钮,Android应用中出现软键盘遮挡住按钮如何解决
  8. android 怎么调用js项目_APP逆向神器之Frida【Android初级篇】
  9. efi分区咋移动到c盘里_如何移动的EFI系统分区
  10. python秒数变分钟_python时间时分秒与秒数的互相转换