素数环 nyoj (dfs)
2015-09-27 11:10
239 查看
素数环
时间限制: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
#include<stdio.h> #include<string.h> #include<math.h> int b[21],a[21]; int n; int f(int x) { int i; for(i=2;i<=sqrt(x);i++) { if(x%i==0) return 0; } return 1; } void dfs(int x) { int i,j; if(x==n+1&&f(1+a )) { for(i=1;i<=n;i++) { if(i>1) printf(" "); printf("%d",a[i]); } printf("\n"); return ; } else { for(i=2;i<=n;i++) { if(b[i]==0&&f(i+a[x-1])) { b[i]=1; a[x]=i; dfs(x+1); b[i]=0; } } return ; } } int main() { int c=1; int i; while(scanf("%d",&n),n) { for(i=1;i<=n;i++) { a[i]=0; b[i]=0; } a[1]=b[1]=1; printf("Case %d:\n",c++); if(n&1) { if(n==1) printf("1\n"); else printf("No Answer\n"); } else dfs(2); } return 0; }
相关文章推荐
- java面试题二十五 构造函数
- 深层复制与浅层复制
- Java核心技术第3章(4)
- 用反射封装HttpHandler,实现通过action方法名调用方法
- 更改nginx网站根目录
- 链表常用函数
- LAMP+DNS+nfs+Samba实现discuz论坛
- VIM+Ctags Linux源码阅读神器
- PPT制作教程:如何制作ppt
- HDU 5476 Explore Track of Point(平面几何)
- 软件测试的认识
- Android项目包装apk和apk反编译,xml反编译
- 查找
- 【树链剖分】【最大生成树】[NOIP2013]codevs3287 货车运输
- opencv2-3生成标定用的方格图
- JavaWeb显示器
- CSS字体属性全解析
- 第二章 SSH远程登录
- "_stringprep", referenced from:+[LibIDN prepNode:] in LibIDN.o
- aspnet生成matlab图在web上显示