2016寒假训练——搜索
2016-02-23 19:49
267 查看
来源:HDU1016
搜索题。。。就是对于1~n的数进行环排列,然后相邻的两个数相加是素数。
显然DFS。
一些注意点:
1.由于n<20所以不必要对于1~40的素数进行打表,直接列举.
2.DFS对于记录,用一个vis数组进行记录。
3.判断a[0]和a[n-1]的和是否成立。
4.要输出所有的情况,就是需要等dfs自行结束,一般而言,求最值才需要我们的bfs
5.中间的空行
AC代码(VJ提交):
搜索题。。。就是对于1~n的数进行环排列,然后相邻的两个数相加是素数。
显然DFS。
一些注意点:
1.由于n<20所以不必要对于1~40的素数进行打表,直接列举.
2.DFS对于记录,用一个vis数组进行记录。
3.判断a[0]和a[n-1]的和是否成立。
4.要输出所有的情况,就是需要等dfs自行结束,一般而言,求最值才需要我们的bfs
5.中间的空行
AC代码(VJ提交):
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int n,cnt = 1; int vis[21],A[21]; int primelist[38] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1}; void dfs(int cur) { if(cur == n && primelist[A[0] + A[n-1]]) { cout << A[0] ; for(int i = 1;i < n;++i) cout << " "<< A[i]; cout <<endl; } else for(int i = 2;i <= n;i++) if(!vis[i] && primelist[i + A[cur-1]]) { A[cur] = i; vis[i] = 1; dfs(cur + 1); vis[i] = 0; } return ; } int main() { A[0] = 1; while(cin >> n) { memset(vis,0,sizeof(vis)); cout << "Case " << cnt++ <<":\n"; dfs(1); cout << endl; } return 0; }
相关文章推荐
- scrapy 单脚本执行 爬去jandan无聊图的gif文件
- Codeforces 623B:Array GCD
- Apache shiro 笔记整理之编程式授权
- The world beyond batch: Streaming 101
- 分别利用(代码,Xib,SB)创建空的App工程
- 所有的文章全部用新的编辑器重新编辑
- java的动态代理机制
- 2016 IT 互联网 各大公司内推
- echo 输入指定空白字符
- 计算日子差。自由年月日。含闰年判断
- 从新手到专家的的几个阶段
- 1
- 【Boost】 ASIO 译文
- Android中级篇之百度地图SDK v3.5.0-配置环境及发布[图解AndroidStudio下配置.so文件]
- 《拆掉思维里的墙》~~想跳槽的同学可以先看看这本书!
- CollegeStudent
- Java线程池(2)
- linux入命令基础
- 浏览器 html src属性 href属性
- css:display