回溯剪枝,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+思维:按照权值的大小,从小的到大的连有 ...
随机推荐
- 【RPA之家转载RPA创新产业峰会回看】机器人流程自动化专利态势报告
[RPA之家转载RPA创新产业峰会回看]机器人流程自动化专利态势报告 自动化的一个专利情况的监测,就是全球监测的情况.今天我可能给大家汇报的主要是三个方面,第一个方面就是讲一下全球投资智能化的专利的一 ...
- python超级有用的实战项目,拿走不谢~
写在前面的一点P话: Python是目前最好的编程语言之一.由于其可读性和对初学者的友好性,已被广泛使用. 那么要想学会并掌握Python,可以实战的练习项目是必不可少的. 直接上第一个项目~ 猜字游 ...
- 零基础学Python:元组(Tuple)详细教程
Python的元组与列表类似,不同之处在于元组的元素不能修改,元组使用小括号,列表使用方括号,元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可https://jq.qq.com/?_wv=1 ...
- 生成RSA密钥的方法[转载]
openssl genrsa -des3 -out privkey.pem 2048 这个命令会生成一个2048位的密钥,同时有一个des3方法加密的密码,如果你不想要每次都输入密码,可以改成(测试常 ...
- 匿名对象作为方法的参数和返回值与Random概念和基本使用
应用场景 1. 创建匿名对象直接调用方法,没有变量名. new Scanner(System.in).nextInt(); 2. 一旦调用两次方法,就是创建了两个对象,造成浪费,请看如下代码. new ...
- do-while循环和三种循环的区别
循环语句3--do...while do...while循环格式 初始化表达式① do{ 循环体③ 步进表达式④ }while(布尔表达式②); 执行流程 执行顺序:①③④>②③④>②③④ ...
- Java学习第二周
这一周观看了黑马程序员毕向东的教学视频学习了数组的创建:数组元素的使用及遍历,类的声明,成员方法的声明,构造器的声明 数据类型[] 数组名 = new 数据类型[长度];数据类型[] 数组名 = {数 ...
- Nginx越界读取缓存漏洞 CVE-2017-7529
1.漏洞描述 Nginx在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件.缓存的部分存储在文件中,每个缓存文件包括"文件头"+"HTTP返回包头" ...
- STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- 论文阅读 Inductive Representation Learning on Temporal Graphs
12 Inductive Representation Learning on Temporal Graphs link:https://arxiv.org/abs/2002.07962 本文提出了时 ...