回溯剪枝,dfs,bfs
dfs:
给定一个整数n,将数字1~n排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数n。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤71≤n≤7
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#############################################
1 #include <bits/stdc++.h>
2 using namespace std;
3
4 const int N = 10;
5 int n;
6 int path[N];
7 vector<bool> flag(N,false);
8
9 //dfs两个步骤:1:函数参数逐渐靠近叶子节点 2:处理好一个子过程
10 //dfs的参数就是递归树的层数,也就是path的路经,必须每一次递归都接近出口
11 void dfs(int u){
12 if(u == n){
13 for(int i = 0;i < n;++i)cout << path[i] << " ";
14 cout << endl;
15 return;
16 }
17 for(int i = 1;i <= n;++i){
18 if(flag[i] == false){
19 flag[i] = true;
20 path[u] = i;
21 dfs(u + 1);
22 flag[i] = false;
23 }
24 }
25 }
26
27 int main(){
28 cin >> n;
29 dfs(0);
30 return 0;
31 }
回溯剪枝:
n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
现在给定整数n,请你输出所有的满足条件的棋子摆法。
输入格式
共一行,包含整数n。
输出格式
每个解决方案占n行,每行输出一个长度为n的字符串,用来表示完整的棋盘状态。
其中”.”表示某一个位置的方格状态为空,”Q”表示某一个位置的方格上摆着皇后。
每个方案输出完成后,输出一个空行。
数据范围
1≤n≤91≤n≤9
输入样例:
4
输出样例:
.Q..
...Q
Q...
..Q.
..Q.
Q...
...Q
.Q..
1 #include <iostream>
2 #include <vector>
3 using namespace std;
4
5 const int N = 20;
6 int n;
7 char map[N][N];
8 vector<bool> col(N,false),p(N,false),up(N,false);//col 用来判断当前列,p用来判断左斜对角线,up用来判断右斜对角线
9
10 void dfs(int u){
11 if(u == n+1){
12 for(int i = 1;i <= n;++i){
13 for(int j = 1;j <= n;++j)
14 cout << map[i][j];
15 cout << endl;
16 }
17 cout << endl;
18 return;
19 }
20
21 for(int i = 1;i <= n;++i){
22 if(!col[i] && !p[u+i] && !up[u + n - i]){
23 col[i] = p[u+i] = up[u+n-i] = true;
24 map[u][i] = 'Q';
25 dfs(u+1);
26 col[i] = p[u+i] = up[u+n-i] = false;
27 map[u][i] = '.';
28 }
29 }
30 }
31
32 int main(){
33 cin >> n;
34 for(int i = 1;i <= n;++i){
35 for(int j = 1;j <= n;++j)
36 map[i][j] = '.';
37 }
38 dfs(1);
39 return 0;
40 }
bfs:
走迷宫:
给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。
最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。
请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。
数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条通路。
输入格式
第一行包含两个整数n和m。
接下来n行,每行包含m个整数(0或1),表示完整的二维数组迷宫。
输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。
数据范围
1≤n,m≤1001≤n,m≤100
输入样例:
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
输出样例:
8
################################################
1 #include <bits/stdc++.h>
2 using namespace std;
3
4 const int N = 110;
5 int g[N][N];//地图
6 vector<vector<int>> d(N,vector<int>(N,-1));//距离
7 int n, m;
8
9 int bfs(int a, int b){
10 d[1][1] = 0;
11 queue<pair<int, int>> q;
12 q.push({a,b});
13 int dx[4] = {0,1,0,-1}, dy[4] = {-1,0,1,0};
14 //bfs模板就是队头出队,拓展
15 while(!q.empty()){
16 pair<int, int> t = q.front();
17 q.pop();
18 for(int i = 0;i < 4;++i){
19 int x = t.first + dx[i], y = t.second + dy[i];
20 if(x >= 1 && x <= n && y >= 1 && y <= m && d[x][y] == -1 && g[x][y] == 0)
21 {
22 q.push({x,y});
23 d[x][y] = d[t.first][t.second] + 1;
24 }
25 }
26 }
27 return d[n][m];
28 }
29
30
31 int main(){
32 cin >> n >> m;
33 for(int i = 1;i <= n;++i)
34 for(int j = 1;j <= m;++j)
35 cin >> g[i][j];
36 cout << bfs(1,1) << endl;
37 return 0;
38 }
bfs的一道比较难的题:
在一个3×3的网格中,1~8这8个数字和一个“X”恰好不重不漏地分布在这3×3的网格中。
例如:
1 2 3
X 4 6
7 5 8
在游戏过程中,可以把“X”与其上、下、左、右四个方向之一的数字交换(如果存在)。
我们的目的是通过交换,使得网格变为如下排列(称为正确排列):
1 2 3
4 5 6
7 8 X
例如,示例中图形就可以通过让“X”先后与右、下、右三个方向的数字交换成功得到正确排列。
交换过程如下:
1 2 3 1 2 3 1 2 3 1 2 3
X 4 6 4 X 6 4 5 6 4 5 6
7 5 8 7 5 8 7 X 8 7 8 X
现在,给你一个初始网格,请你求出得到正确排列至少需要进行多少次交换。
输入格式
输入占一行,将3×3的初始网格描绘出来。
例如,如果初始网格如下所示:
1 2 3
x 4 6
7 5 8
则输入为:1 2 3 x 4 6 7 5 8
输出格式
输出占一行,包含一个整数,表示最少交换次数。
如果不存在解决方案,则输出”-1”。
输入样例:
2 3 4 1 5 x 7 6 8
输出样例
19
############################################
1 #include <bits/stdc++.h>
2 using namespace std;
3
4 vector<string> g;
5
6 int bfs(string state){
7 queue<string> q;
8 unordered_map<string, int> d;//变换到每一个状态所需要的步骤
9
10 q.push(state);
11 d[state] = 0;
12
13 int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
14 string end = "12345678x";
15
16 while(!q.empty()){
17 string t = q.front();
18 q.pop();
19 if(t == end)return d[t];
20 //状态转移
21 int tmp = d[t];//保存初始的状态的步骤
22 int k = t.find('x');
23 int x = k / 3, y = k % 3;
24 for(int i = 0;i < 4;++i){
25 int a = x + dx[i], b = y + dy[i];
26 if(a >= 0 && a < 3 && b >= 0 && b < 3){
27 swap(t[k], t[a*3+b]);//找到对应一维数组的下标,然后交换
28 if(!d.count(t)){//没有过这个状态
29 d[t] = tmp + 1;
30 q.push(t);
31 }
32 swap(t[k], t[a*3+b]);//在交换回来,因为还要从初始状态再转移到其他可行状态
33 }
34 }
35 }
36 return -1;
37 }
38
39 int main(){
40 char t[2];
41 string state;
42 for(int i = 1;i <= 9;++i){
43 cin >> t;
44 state += *t;
45 }
46 cout << bfs(state) << endl;
47 return 0;
48 }
回溯剪枝,dfs,bfs的更多相关文章
- 递归,回溯,DFS,BFS的理解和模板【摘】
递归:就是出现这种情况的代码: (或者说是用到了栈) 解答树角度:在dfs遍历一棵解答树 优点:结构简洁缺点:效率低,可能栈溢出 递归的一般结构: void f() { if(符合边界条件) { // ...
- 递归,回溯,DFS,BFS的理解和模板
LeetCode 里面很大一部分题目都是属于这个范围,例如Path Sum用的就是递归+DFS,Path Sum2用的是递归+DFS+回溯 这里参考了一些网上写得很不错的文章,总结一下理解与模板 递归 ...
- HDU 5113 Black And White 回溯+剪枝
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5113 Black And White Time Limit: 2000/2000 MS (Java/ ...
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...
- ID(dfs+bfs)-hdu-4127-Flood-it!
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...
- 递归,回溯和DFS的区别
递归是一种算法结构,回溯是一种算法思想一个递归就是在函数中调用函数本身来解决问题回溯就是通过不同的尝试来生成问题的解,有点类似于穷举,但是和穷举不同的是回溯会“剪枝”,意思就是对已经知道错误的结果没必 ...
- HDU 2553 N皇后问题(回溯 + 剪枝)
本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398797 题意: 在N*N(N <= 10)的方格棋盘放置了N个皇后,使得它们不相互攻击(即 ...
- POJ2308连连看dfs+bfs+优化
DFS+BFS+MAP+剪枝 题意: 就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路: 首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...
- DFS/BFS+思维 HDOJ 5325 Crazy Bobo
题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...
随机推荐
- 实践GoF的23种设计模式:装饰者模式
摘要:装饰者模式通过组合的方式,提供了能够动态地给对象/模块扩展新功能的能力.理论上,只要没有限制,它可以一直把功能叠加下去,具有很高的灵活性. 本文分享自华为云社区<[Go实现]实践GoF的2 ...
- C语言中限定符的作用
C语言中常用的一般包括const.static.extern.register和volatile这几个.这些是C语言标准中规定的关键词,所有的编译器都必须支持这些关键词,它们的作用如下: 1.cons ...
- API概述,使用步骤和Scanner概述及其API文档的使用
API概述 API(Application Programming Interface),应用程序编程接口.Java API是一本程序员的 字典 ,是JDK中提供给 我们使用的类的说明文档.这些类将底 ...
- java导出excel单sheet超过65535数据报错拆分多sheet导出
在开发过程中,数据导出excel的功能很常见,数据少,到没问题,一旦超过65535条数据就会报错,因此可以考虑导出多个sheet来解决,代码如下: private static void export ...
- VMware 无法为处于开启或挂起状态的去你及或快照创建克隆
VMware 要克隆的时候出现 无法为处于开启或挂起状态的去你及或快照创建克隆 因为属于挂起或者运行中的不能克隆,因为会发生数据的变化
- 初次使用 eolink 感受
最近总有前端小伙伴来找我抱怨,"后端接口出来太晚,影响我的任务进度"."后端接口改了也不通知我一下,到冒烟测试的时候报一堆的错".我拉后端小伙伴了解情况,结果问 ...
- OGC WebGIS 常用服务标准(WMS/WMTS/TMS/WFS)速查
本文只介绍实际工作中常用的 WMS.WMTS.WFS.TMS 四种,WCS.WPS 等其它 OGC WebService 类型请自行查阅官方资料. 目录 0. 参数传递方式 1. WMS 速查 1.1 ...
- P4289 【一本通提高篇广搜的优化技巧】[HAOI2008]移动玩具
[HAOI2008]移动玩具 题目描述 在一个 4 × 4 4\times4 4×4 的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方 ...
- centos7更改中文
这是在CentOS7中设置,CentOS6的是在 .etc/sysconfig/i18n 配置文件下.在root用户下操作,使用 locale 命令查看语言环境,看到 LANG=en_US.utf8 ...
- Nuget打包并上传教程
一.准备 1 . 下载 Download NuGet.exe 2 . windows 系统下设置环境变量 path中 或者 在dos 命令窗口下cd转到 nuget.exe 所在目录,这里为了每次使用 ...