http://acm.nyist.net/JudgeOnline/problem.php?pid=488
描述
有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。
为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。
如果存在满足题意叙述的素数环,从小到大输出。
否则输出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
解法1:生成测试法(TLE)
#define RUN #ifdef RUN #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <string> #include <iostream> #include <sstream> #include <map> #include <set> #include <vector> #include <list> #include <cctype> #include <algorithm> #include <utility> #include <math.h> #include <ctime> 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 main() { #ifndef ONLINE_JUDGE freopen("nyist488.in", "r", stdin); freopen("out.out", "w", stdout); #endif int n, A[50], isp[50]; //scanf("%d", &n); int cases = 1; while(cin>>n && n!=0){ bool noAnswer = true; cout << "Case " << cases << ":" << endl; cases++; //生成素数表,加快后面的判断 //判断第i个数是否是素数,如果isp[i]返回1则是,返回0则否 for(int i = 2; i <= n*2; i++) isp[i] = is_prime(i); //A[0]:1 //A[1]:2 //A[2]:3 //... for(int i = 0; i < n; i++) A[i] = i+1; do { int ok = 1; for(int i = 0; i < n; i++) { //如果相邻两数之和不是素数 if(!isp[A[i]+A[(i+1)%n]]) { ok = 0; break; } } if(ok) { noAnswer = false; for(int i = 0; i < n; i++) printf("%d ", A[i]); printf("\n"); } }while(next_permutation(A+1, A+n)); if(noAnswer){ cout << "No Answer" << endl; } } return 0; } #endif
解法2:回溯法+剪枝
同时注意自环的判断
#define RUN #ifdef RUN #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <string> #include <iostream> #include <sstream> #include <map> #include <set> #include <vector> #include <list> #include <cctype> #include <algorithm> #include <utility> #include <math.h> #include <ctime> using namespace std; bool noAnswer; int cases = 1; #define MAXN 10000 int is_prime(int x) { for(int i = 2; i*i <= x; i++) if(x % i == 0) return 0; return 1; } int n, A[MAXN], // A数组用于保存结果 A[x]=y 第x个位置放了大小为y的数 isp[MAXN], // isp数组用于判断是否素数 isp[x]=y 大小为x的数,其素数属性为y vis[MAXN]; // vis数组用于标示第i个数是否已经被使用过了 vis[x]=y,大小为x的数,已使用性为y void dfs(int cur) { //递归边界,同时测试第一个数和最后一个数 if(cur == n && isp[A[0]+A[n-1]]) { noAnswer = false; for(int i = 0; i < n; i++) printf("%d ", A[i]); printf("\n"); } else { for(int i = 2; i <= n; i++){ if(!vis[i] && isp[i+A[cur-1]]) { A[cur] = i; //标志把数i放在cur的位置上 vis[i] = 1; //标志i已经用了 dfs(cur+1); //寻找下一个位置应该放的数 vis[i] = 0; //还原全局变量,清除标志 } } } } int main() { #ifndef ONLINE_JUDGE freopen("nyist488.in", "r", stdin); freopen("out.out", "w", stdout); #endif //生成素数表,加快后面的判断 //判断第i个数是否是素数,如果isp[i]返回1则是,返回0则否 memset(isp, 0, sizeof(isp)); //isp[2] = isp[3] = isp[5] = isp[7] = isp[11] = isp[13] = isp[17] = isp[19] = isp[23] = isp[29] = isp[31] = isp[37] = 1; for(int i = 2; i <= 20*2; i++){ isp[i] = is_prime(i); } A[0] = 1; while(scanf("%d",&n) && n!=0){ noAnswer = true; cout << "Case " << cases << ":" << endl; cases++; memset(vis, 0, sizeof(vis)); //自环的情况 if(n==1) { printf("%d\n",A[0]); continue;} //重要的剪枝!!! //如果n为奇数,存在不等于2的偶数,不为素数,可以直接排除 // 奇+偶=奇 // 奇+奇=偶 // 偶+偶=偶 if(n%2 != 0) { printf("No Answer\n"); continue;} dfs(1); if(noAnswer){ cout << "No Answer" << endl; } } return 0; } #endif
相关推荐
《NYIST_数据结构实验指导书》是一本针对南阳理工学院软件学院软件工程专业的数据结构实验教材,主要涵盖线性表、栈、队列、图论、查找和排序等核心概念。实验旨在帮助学生理解和掌握数据结构的基本操作及其在计算机...
NYIST数据结构实验指导书样本.doc 本资源摘要信息主要涵盖了数据结构实验指导书的相关知识点,包括线性表、栈和队列、图论及其应用、查找和排序等。 一、线性表应用 * 线性表的定义:线性表是一种基本的数据结构...
【NYIST-Linux应用开发实验指导书】 本实验指导书主要针对南阳理工学院软件学院软件工程教研室的学生,旨在提供Linux环境下应用开发的基础知识和实践技能。通过一系列实验,学生将掌握GCC编译器的使用、GDB调试器的...
1. 声明一个Circle类,有 1) 数据成员Radius(半径) 2) 成员函数GetValue()用来给半径赋值 3) 成员函数GetArea()计算圆的面积 在主函数中创建一个Circle类的对象进行测试,显示出面积。 2. 声明一个tree类,有 ...
数据结构是计算机科学中的核心课程,它探讨了如何有效地存储和处理数据,以便进行高效的计算。本实验指导书主要关注线性表、栈、队列和二叉树等基础数据结构的应用。 实验1关注线性表,这是一种基本的数据结构,...
《南阳理工二手交易平台 | Secondary trading platform For Nyist》 Just For Share | 仅仅分享 使用申明 禁止用来盈利 前前后后开发2年时间啦 感谢你的支持,麻烦点个star,辛苦 将本项目拉取到本地之后,立刻执行...
给n个点,m条边,让构建一个有向无环无重边的图,并且图的最短路是素数,最小生成树也是素数。 思路: 题意的可塑造性很强,我们可以让最小生成树就是最短路,呢么我们现在就是给最小生成树找一个素数,很明显最小生成...
【nyist-studentonline-project: 学生在线app用户行为分析】 该项目主要关注的是对学生在线应用的用户行为进行深入分析,以提供数据驱动的决策支持和优化建议。在这个项目中,我们将探讨以下几个关键知识点: 1. ...
- **DNS服务器IP地址**:202.102.240.65,主机名:ns1.nyist.net - **网络设备**:校园网通过华为8016交换机接入Internet - **待解析服务器**:包括代理服务器Proxy68.nyist.net (202.102.240.68),Web服务器...
题意: 给n个位置,q次操作,每次对操作可以改变i位置的数,定义f(i,j)=ai∗a(i+1)∗…∗aj.f(i,j) = ai * a(i+1) * … * aj.f(i,j)=ai∗a(i+1)∗…∗aj. 求整个区间中所有子区间乘积的和对10007取模 ...
镜子Z 您的下一个MirrorS不是MirrorS,也不是MirrorSes,它是MirrorZ。 镜像站点的最终站点。 演示版 。 当前,每个Mirror站点的mirrorz.json由其维护者或第三方实时或静态生成。 还提供了旧版网页(适用于w3m和...
source insight 插件合集, 非常适用的Sourceinsight插件,提高效率事半功倍 http://www.cnblogs.com/wangqiguo/p/3713211.html http://blog.csdn.net/nyist327/article/details/39935379
我的第二个小应用程序#1.0版本 作者:java2班 许江川@2007.1.1 版权所有:◎ 2006~2007 nyist.2006.java2.浪迹天涯 Softwere http://xjch4539.googlepages.com此程序为共享产品,使用之前请先阅读介绍!
本文实例为大家分享了C语言... Author: nyist_xiaod Date : 2012.5.8 */ #include #include #include #include <stdlib> #define Print_Head_Num puts(班级 姓名 语文 数学 英语 总成绩) #define Print_Head_C
//FileName:class.php //Summary: Access数据库操作类 //Author: forest //CreateTime: 2006-8-10 //LastModifed: //copyright (c)2006 freeweb.nyist.net/~chairy [email]chaizuxue@163.com[/email] // ...
//FileName:class.php //Summary: Access数据库操作类 //Author: forest //CreateTime: 2006-8-10 //LastModifed: //copyright (c)2006 //http://freeweb.nyist.net/~chairy //[email]chaizuxue@163.com...
项目包含的文件中,“nyist_chat_project”应该是项目的源代码目录,包含了Spring Boot应用的配置、控制器、服务层、DAO层以及WebSocket的相关实现。开发者可以通过阅读这些代码来理解如何将WebSocket与Spring Boot...
4. CentOS mini操作系统的ISO镜像,可以从中国的开源镜像站下载,例如http://mirror.nyist.edu.cn/centos/6.8/isos/x86_64/或官方网站https://www.centos.org/download/。 安装过程分为以下几个步骤: 1. 在VMware ...