题目描述:

  输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数。输出时从整数1开始逆时针排列并且不能重复;

  例样输入:

  6

  例样输出:

  1 4 3 2 5 6

  1 6 5 2 3 4

方法1:(生成测试法,会超时)

  1. #include <bits/stdc++.h>
  2. #define MAXN 100
  3. using namespace std;
  4.  
  5. int isp[MAXN], a[MAXN];
  6.  
  7. void get_prime(void) //*****素数打表
  8. {
  9. memset(isp, , sizeof(isp));
  10. isp[]=isp[]=;
  11. for(int i=; i<MAXN; i++)
  12. {
  13. if(isp[i])
  14. {
  15. for(int j=; j*i<MAXN; j++)
  16. {
  17. isp[i*j]=;
  18. }
  19. }
  20. }
  21. }
  22.  
  23. int main(void)
  24. {
  25. std::ios::sync_with_stdio(false),cin.tie(),cout.tie();
  26. get_prime();
  27. int n;
  28. cin >> n;
  29. for(int i=; i<n; i++)
  30. {
  31. a[i]=i+;
  32. }
  33. do
  34. {
  35. int flag=;
  36. for(int i=; i<n; i++) //****逐个尝试
  37. {
  38. if(!isp[a[i]+a[(i+)%n]]) //****判断合法性
  39. {
  40. flag=;
  41. break;
  42. }
  43. }
  44. if(flag) //****如果合法则输出序列
  45. {
  46. for(int i=; i<n; i++)
  47. {
  48. cout << a[i] << " ";
  49. }
  50. cout << endl;
  51. }
  52. }while(next_permutation(a+, a+n)); //***1的位置不变
  53. return ;
  54. }

方法2:(dfs+回溯)

代码:

  1. #include <bits/stdc++.h>
  2. #define MAXN 100
  3. using namespace std;
  4.  
  5. int isp[MAXN], a[MAXN], vis[MAXN], n;
  6.  
  7. void get_prime(void) //****素数打表
  8. {
  9. memset(isp, , sizeof(isp));
  10. isp[]=isp[]=;
  11. for(int i=; i<MAXN; i++)
  12. {
  13. if(isp[i])
  14. {
  15. for(int j=; i*j<MAXN; i++)
  16. {
  17. isp[i*j]=;
  18. }
  19. }
  20. }
  21. }
  22.  
  23. void dfs(int cur)
  24. {
  25. if(cur==n && isp[a[]+a[cur-]]) //****递归边界
  26. {
  27. for(int i=; i<n; i++) //***打印合法序列
  28. cout << a[i] << " ";
  29. cout << endl;
  30. }
  31. else
  32. {
  33. for(int i=; i<n; i++) //***逐个尝试
  34. {
  35. if(!vis[i]&&isp[i+a[cur-]]) //***i没用过且满足条件
  36. {
  37. a[cur]=i; //***存储当前序列
  38. vis[i]=; //****标记
  39. dfs(cur+); //***递归
  40. vis[i]=; //***去除标记
  41. }
  42. }
  43. }
  44. }
  45.  
  46. int main(void)
  47. {
  48. std::ios::sync_with_stdio(false),cin.tie(),cout.tie();
  49. get_prime();
  50. cin >> n;
  51. memset(vis, , sizeof(vis));
  52. dfs();
  53. return ;
  54. }

素数环(dfs+回溯)的更多相关文章

  1. UVA 524 素数环 【dfs/回溯法】

    Description   A ring is composed of n (even number) circles as shown in diagram. Put natural numbers ...

  2. nyist 488 素数环(搜索+回溯)

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

  3. 【DFS】素数环问题

    题目: 输入正整数n,对1-n进行排列,使得相邻两个数之和均为素数,输出时从整数1开始,逆时针排列.同一个环应恰好输出一次.n<=16 如输入: 6 输出: 1 4 3 2 5 6 1 6 5 ...

  4. Hdu 1016 Prime Ring Problem (素数环经典dfs)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  5. 素数环 南阳acm488(回溯法)

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

  6. noj算法 素数环 回溯法

    描述: 把1到20这重新排列,使得排列后的序列A满足:a. 任意相邻两个数之和是素数b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的 ...

  7. HDU 1016 素数环(dfs + 回溯)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 一道很典型的dfs+回溯: 根据题意首先进行初始化,即第一个位置为1,然后进行dfs, ...

  8. 素数环问题[XDU1010]

    Problem 1010 - 素数环问题 Time Limit: 1000MS   Memory Limit: 65536KB   Difficulty: Total Submit: 972  Acc ...

  9. HDU 1016 Prime Ring Problem(经典DFS+回溯)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

随机推荐

  1. CMD代码页

    不同字符编码在CMD模式下会出现乱码,需要使用 chcp 代码页 命令来更改代码页显示正常. UTF-8  65001 简体中文 936 437          美国 850          多语 ...

  2. Mongodb——GridFS

    GridFS用于存储和恢复那些超过16M(BSON文件限制)的文件. GridFS将文件分成大块,将每个大块存储为单独的文件.GridFS中限制chunk最大为256k.GridFS使用两个colle ...

  3. 【转载】javaAgent 参数

    -javaagent 这个JVM参数是JDK 5引进的. java -help的帮助里面写道: -javaagent:<jarpath>[=<options>] load Ja ...

  4. js计算24点

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. gulp学习笔记2-安装

    安装nodejs -> 全局安装gulp -> 项目安装gulp以及gulp插件 -> 配置gulpfile.js -> 运行任务 1.去nodejs官网安装nodejs 2. ...

  6. ZJOI day1总结

    虽然没人看,虽然滚了大粗,但还是这样勉励一下自己.. 今年大约是进队无望了. before ZJOI 感觉自己时间很充裕,与lyx大爷一起颓颓颓.. day -3 到xj. day -2 听课.感觉洲 ...

  7. 除Hadoop大数据技术外,还需了解的九大技术

    除Hadoop外的9个大数据技术: 1.Apache Flink 2.Apache Samza 3.Google Cloud Data Flow 4.StreamSets 5.Tensor Flow ...

  8. 【架构】How To Use HAProxy to Set Up MySQL Load Balancing

    How To Use HAProxy to Set Up MySQL Load Balancing Dec  2, 2013 MySQL, Scaling, Server Optimization U ...

  9. 【leetcode】Find Peak Element

    Find Peak Element A peak element is an element that is greater than its neighbors. Given an input ar ...

  10. 用C语言把双向链表中的两个结点交换位置,考虑各种边界问题。

    用C语言把双向链表中的两个结点交换位置,考虑各种边界问题. [参考] http://blog.csdn.net/silangquan/article/details/18051675