HDU1016简单DFS 素数圈
来源:互联网 发布:vue.js blog 编辑:程序博客网 时间:2024/06/04 18:26
问题:http://acm.hdu.edu.cn/showproblem.php?pid=1016
给一个数字N,把1到N的数字围成圈子,不论从左到右还是从右到左,相邻两个数相加都是素数。
顺时针打印出所有可能的情况。
思路:
20个数排列,有20!种情况。选出符合的情况。可以暴力。可以说是递归题,或者dfs题。
用b[i]用来存储每个数字的使用情况,a[i]存储每个位置的数字。第一个数字为1,DFS(i,n),如果i==n表明当前情况结束,return;否则从未被选择的数字从选取a[i+1],满足相加为素数的情况。
#include<iostream>#include<cmath>#include<string.h>#include<stdio.h>using namespace std;int a[25];bool b[25];bool su(int m)//判断是否为素数{ for (int i = 2; i <= sqrt(m); i++) if (m%i == 0) return 0; return 1;}void dfs(int i,int n){if (i == n)//返回条件 { if (su(a[n] + a[1]))最后一个数也满足 { for (int m = 1; m <= n; m++)开始打印 { if (m == 1)cout << a[m]; else cout << " " << a[m]; } cout << endl; } return; } else { for (int j = 2; j <= n; j++)选取下一个符合的数字 { if (b[j]&&su(a[i]+j)) { a[i + 1] = j; b[j] = 0; dfs(i + 1,n); b[j] = 1; } } }return;}int main(){ int n,sum=0; while (cin >> n) { memset(a, 0, sizeof(a)); a[1] = 1; for (int i = 1; i <= n; i++) b[i] = 1; printf("Case %d:\n", ++sum); dfs(1,n); cout << endl; } return 0;}
阅读全文
0 0
- HDU1016简单DFS 素数圈
- hdu1016素数环(DFS)
- 【HDU1016】素数环(dfs)
- hdu1016 DFS+素数判断
- hdu1016(素数环剪枝dfs)
- hdu1016(dfs运用)素数环
- HDU1016【简单递归.DFS】
- nyoj488&&hdu1016 素数环(DFS)
- 素数环问题 HDU1016 DFS深搜
- hdu1016-Prime Ring Problem(简单dfs)
- hdu1016--dfs
- HDU1016 DFS
- HDU1016(DFS)
- hdu1016(dfs)
- HDU1016 DFS
- hdu1016 Prime Ring Problem dfs 素数打表
- HDU1016 Prime Ring Problem(素数环,深搜DFS)
- hdu1016枚举递归-经典DFS-简单回溯入门
- SurfaceView及TextureView
- mysql 用户管理和权限设置
- Github上bitcoin的CPU挖矿程序部署编译
- virt-install could not open disk image
- 从零开始学Scala系列(六)之类(Classes)和对象(Objects)
- HDU1016简单DFS 素数圈
- Setup NGINX, PHP-FPM, and MariaDB on Debian 8
- climits 头文件
- 动作游戏小demo
- 【cogs728】【网络流24题】最小路径覆盖问题
- VISUAL Studio2013提示malloc是未定义的标识符
- 直方图匹配
- JAVA设计模式之策略模式
- activiti学习--13:组任务分配方式1直接方式+查询正在执行的任务办理人表+查询历史任务的办理人表+拾取任务+将个人任务回退到组任务+向组任务中添加/删除成员