题目:

1016 Prime Ring Problem
  1 /*
  2 素数环(顺时针逆时针)---dfs
  3 使用栈
  4 1-n(n最大是20,相邻最大和39,素数范围2-39之间)
  5 2-39间的素数:
  6 2,3,5,7,11,13,17,19,23,29,31,37
  7 从1开始,逐个尝试,如果是素数,入栈,否则尝试下一个,直到全部尝试完;
  8 如果n个数全部入栈了,输出一组解(n最大为20,输出栈可以使用递归),
  9 第一个数始终是1,第二个数需要尝试n+1的时候,就表示结束了(next = -1)。
 10 */
 11 #include <cstdio>
 12 #include <iostream>
 13 #include <stack>
 14 using namespace std;
 15
 16 #define N    22
 17 //全局变量
 18 int prime[40];
 19 int arr[N];
 20 stack<int> s;
 21
 22 //函数
 23 void InitPrime();
 24 void InitArr(int n);
 25 void dfs(int n);
 26 int GetNext(int b,int n);
 27 void Output(int n);
 28 //main
 29 void main()
 30 {
 31     int n;
 32     InitPrime();
 33     while (scanf("%d",&n)!=EOF)
 34     {
 35         InitArr(n);
 36         dfs(n);
 37     }
 38 }
 39
 40 void InitPrime()
 41 {
 42     for (int i=0;i<40;i++)
 43     {
 44         switch(i)//本题数量不多,就直接这样写啦,如果数量多可以用【筛选法】或者【试除法】
 45         {
 46         case 2:        case 3:        case 5:
 47         case 7:        case 11:    case 13:
 48         case 17:    case 19:    case 23:
 49         case 29:    case 31:    case 37:
 50             prime[i] = 1;
 51             break;
 52         default:
 53             prime[i] = 0;
 54         }
 55     }
 56 }
 57
 58 void InitArr(int n)
 59 {
 60     for (int i=1; i<=n ; i++)
 61     {
 62         arr[i] = 0;
 63     }
 64 }
 65 void dfs(int n)
 66 {
 67     int flag,next,b,idx;
 68     s.push(1);
 69     arr[1] = 1;
 70     flag = 1;
 71     idx = 1;//从idx开始寻找匹配数字
 72     while (flag)
 73     {
 74         b = s.top();
 75         next = GetNext(idx,n);
 76         if (next == -1)//尝试结束,回溯
 77         {
 78             if (b == 1 && next == -1)//over
 79             {
 80                 flag = 0;
 81             }
 82             idx = s.top();
 83             s.pop();
 84             arr[idx] = 0;
 85             continue;
 86         }
 87         if (prime[next+b] == 1)//匹配成功,next入栈,idx化为2
 88         {
 89             arr[next] = 1;
 90             s.push(next);
 91             idx = 1;
 92             //全部入栈则输出
 93             if (s.size() == n && prime[1+s.top()] == 1)//既要顺时针为素数环又要逆时针为素数环
 94             {
 95                 Output(n);
 96                 cout<<endl;
 97                 idx = s.top();
 98                 s.pop();
 99                 arr[idx] = 0;
100             }
101             continue;
102         }
103         //匹配失败,idx化为next
104         idx = next;
105     }
106
107 }
108 int GetNext(int b,int n)
109 {
110     for (int i=b+1;i<=n;i++)
111     {
112         if (arr[i]!=1)
113             return i;
114     }
115     return -1;//全部尝试完返回-1
116 }
117 void Output(int n)
118 {
119     int cur;
120     if (n!=0)
121     {
122         cur = s.top();
123         s.pop();
124         Output(n-1);
125         cout<<cur<<' ';
126         s.push(cur);//还要加回去
127     }
128 }

HDOJ1016 素数环(DFS)相关推荐

  1. 素数环问题 DFS

    素数环问题 将从1到n这n个整数围成一个圆环, 若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环. 现要求输入一个n,求n个数围成一圈有多少种素数环, 规定第一个数字是1.写出相应的 ...

  2. 素数环问题---深度搜索遍历

    1264: 素数环 时间限制: 1 Sec  内存限制: 128 MB 提交: 29  解决: 8 [提交][状态][讨论版] 题目描述 有一个长度为n的环形序列由1,2,3,...,n组成,环中相邻 ...

  3. 质数环问题c语言,素数环问题

    问题描述:将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环. n=20时,下面的序列就是一个素数环: 1 2 3 4 7 6 5 8 9 10 13 ...

  4. 美丽的项链(素数环)(回溯法)

    题目描述 520马上就要到了,丁丁妹在思考送自己的室友什么礼物能够彰显她深深的室友之爱. 由于丁丁妹最近沉迷于数学,于是她想出了一个绝(土)妙(味)的礼物--素数项链. 具体而言,素数项链是一个由1~ ...

  5. 素数环问题(回溯法)

    素数环是一个计算机程序问题,指的是将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环. 现在要求输入一个n,求n个数围成一圈有多少种素数环,规定第一个 ...

  6. 素数环 与 算法 全排列

    在说起全排列前,先说一下昨天碰到的一个题目(答案不是我做出来的,但是我感觉有好多个亮点,贴出来方便日后的学习): 素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 ...

  7. 编程解决素数环问题Java_回溯法解决素数环问题java实现

    素数环问题: 输入正整数n,把整数1,2,3--,n组成一个环,使得相邻两个整数之和均为素数,输出所有方案,注意同一个环应恰好输出一次.n<==16 样例输入: 6 样例输出: 1 4 3 2  ...

  8. java编程实现素数环_回溯法解决素数环

    #include #include using namespace std;#define N 100000int isp[2 * N];int a[N];int visited[N];int is_ ...

  9. 素数环java_素数环问题

    DFS,好像主要是对dfs的递归调用吧,自己也不太懂, 总之,它很神奇,多看看代码吧 #include #include #include #include int n; int isp[100]; ...

  10. SDUTOJ3469_深度优先搜索练习之神奇的矩环(DFS)

    深度优先搜索练习之神奇的矩环 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 小鑫的女 ...

最新文章

  1. 两个形状不同的长方形周长_借助思维导图玩转小学阶段三种不同计算图形周长的方法!...
  2. Win2K下关联进程/端口之代码初步分析
  3. 百果园付凌峰:线上单月 1.2 亿背后的数据化运营
  4. 如何安装最新版本的ABAP Development tools
  5. jquery 字符串查找_JQuery、Vue等考点
  6. 人眼定位python代码_使用dlib,OpenCV和Python进行人脸识别—人眼眨眼检测
  7. java语音读字符串_Android Java文本到语音查看额外的字符串信息
  8. webApp调试页面的几种方式
  9. Yii 2.0 权威指南 (2) 使用forms
  10. python+opencv简单人脸识别(源码)(有手就行)
  11. 神经网络用英文怎么说,神经网络算法的英文
  12. Unity遍历文件夹及其文件
  13. 矩阵转置行列式的运算规律
  14. 外接鼠标时禁用触控板_连接外接鼠标时如何禁用PC的触摸板
  15. CM源码(CyanogenMod)源码编译
  16. 单片机常用芯片总结(一)——LCD1602液晶屏
  17. 黑马程序员各学科超长体验课知识点汇总
  18. 梅宏院士:大数据技术的四大挑战与十大趋势
  19. 洛谷 P3374 树状数组模板1
  20. ArcGIS制图学习(1)

热门文章

  1. 漂亮的html404页面源码,一个简单而又漂亮的404页面源码
  2. 凯盛机器人_机器人登场!水泥发运告别人工,粉尘危害降至最低
  3. java 与 php lajp_LAJP
  4. android studio使用nodejs本地服务器json数据_使用Node.js的Alexa技巧
  5. 学业水平考试网登录_海南高中学业水平考试成绩查询免费登录入口:http://ea.hainan.gov.cn/(已开通)...
  6. Kafka:Zero-Copy零拷贝
  7. Centos系统磁盘扩容
  8. [BZOJ 2839] 集合计数
  9. 微信小程序——tab切换内容
  10. UCenter创始人密码正确但是登录不了