NYOJ 488 素数环 (深搜DFS)
2015-10-09 19:50
267 查看
素数环
时间限制:1000 ms | 内存限制:65535 KB难度:2
描述
有一个整数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
题目链接:NYOJ 488 素数环 (深搜DFS)
思路 相邻的两个数的和是素数,都从 1 开始,形成一个环。 通过 深搜 (DFS)实现全排列, 由于是从 1 开始, 所以将 1 作为单独的 一个,对后面的进行全排列,去掉相邻和不是素数的序列,最后,判断两端的数与 1 能否形成素数环。
特别注意 n为 1 自成环 n为奇数 不能成环 判断和为素数 建表 或 直接判断
已AC代码:
#include<cstdio> #include<cstring> #include<cmath> int s[50],a[50],n; // s 存放要取用的数,a 存放已排好的数 int vis[50]; // 标记 是否已取用 //int sushu[50]={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,1,0,1,0};//建立素数表 int judge(int x) // 直接判断素数 { for(int i=2;i<=sqrt(x);++i) if(x%i==0) return 0; return 1; // return sushu[x]; } void DFS(int x) { if(x>=n-1) { if(judge(1+a[0])==0||judge(1+a[n-2])==0) return ; // 判断 1 和 a 的第一个以及最后一个元素 的和 是否是素数 printf("1"); // 1 要单独输出 for(int i=0;i<n-1;++i) printf(" %d",a[i]); printf("\n"); return ; } for(int i=0;i<n-1;++i) { if(x==0||judge(a[x-1]+s[i])==1 && vis[i]==0) //注意 x=0单独加入a,判断 将要加入的数与前一个数的和是否是素数 { a[x]=s[i]; vis[i]=1; // 标记已加入的数 DFS(x+1); vis[i]=0; // 回溯时取消标记 } } } int main() { int i,CASE=1; while(scanf("%d",&n),n) { printf("Case %d:\n",CASE++); if(n==1) // 特别注意 1自成环 { printf("1\n"); continue; } if(n%2==1) //奇数不可能成环 { printf("No Answer\n"); continue; } for(i=0;i<n-1;++i) s[i]=i+2; // 直接从 2 开始,1 作为单独的数 memset(vis,0,sizeof(vis)); DFS(0); // a下标为 0 ,从 0 开始 搜索 } return 0; }
相关文章推荐
- UML类图图示样例
- UINavigationController
- 第六周实践项目1--建立顺序栈算法库
- HDU 3572 Task Schedule
- 三种简单的html网页自动跳转方法
- Git SSH Key 生成步骤
- 6.5.3反转排序
- 华为2016研发工程师编程题
- hdu5475 An easy problem
- Android基础学习之Provider(内容提供器)
- C# 将数据表导出到Excel通用方法
- linux基础
- Python中unicode编码的字符串和其他格式的字符串之间进行转换
- User32.dll 接口中GetSystemMatrics(int nIndex )
- 获取对象信息
- 构造NFS
- web字体
- 6.5.2直接选择排序
- Flex工程部署到Tomcat的步骤
- 压力测试