HDU-1016-Prime Ring Problem
2016-04-01 12:17
453 查看
HDU-1016-Prime Ring Problem
题目链接:HDU-1016题目大意:输入正整数n,把整数1,2,3,…,n组成一个环,使得相邻两个整数之和为素数。输出时从整数1开始。
题目思路:DFS,注意判断最后一个和第一个数相加也是素数
以下是代码:
#include <vector> #include <map> #include <set> #include <algorithm> #include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #include <string> #include <cstring> using namespace std; int prm[100000]; const int MAXV = 1e5; bool isPrime[MAXV+1]; int size=0; int A[30]; int vis[30]; //获得素数 void getPrime() { memset(isPrime, true, sizeof(isPrime)); int sq = sqrt((double)MAXV) + 1; int i,j,k; for(i = 2;i <= sq; i++) if(isPrime[i]) for(j = 2,k = MAXV/i+1;j < k;j++) isPrime[i*j] = false; for( i = 2 ; i <= MAXV; i++) if(isPrime[i]) prm[size++] = i; isPrime[0] = isPrime[1] = false; } int n; int cnt = 1; int first = 1; void dfs(int cur) { if (cur == n + 1 && isPrime[A + A[1]]) { printf("%d",A[1]); for(int i = 2; i <= n; i++) { printf(" %d",A[i]); } printf("\n"); return; } for (int i = 1; i <= n; i++) { if (!vis[i] && isPrime[i + A[cur - 1]]) { vis[i] = 1; A[cur] = i; dfs(cur + 1); vis[i] = 0; } } } int main(){ getPrime(); while(scanf("%d",&n) != EOF) { printf("Case %d:\n",cnt++); memset(vis,0,sizeof(vis)); memset(A,0,sizeof(A)); vis[1] = 1; A[1] = 1; if (n % 2 != 1) dfs(2); printf("\n"); } return 0; }
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- HDU 1568
- HDU1290
- POJ1523 SPF dfs
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)