回溯剪枝,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+思维:按照权值的大小,从小的到大的连有 ...
 
随机推荐
- ASP.NET Core 6 从入门到企业级实战开发应用技术汇总
			
系列目录 [已更新最新开发文章,点击查看详细] 本系列博客主要介绍.NET6相关技术,从基础入门.进阶提升到高级升华,最后通过一个企业级项目实战来检验技术应用能力.把个人技术与经验分享出来,抛 ...
 - Redis 笔记 01:入门篇
			
Redis 笔记 01:入门篇 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...
 - java使用配置skywalking
			
一 .elasticsearch 和elasticsearch-head 1.下载 elasticsearch-6.3.1 ,下载地址 :https://pan.baidu.com/s/1ymxy ...
 - Reading configuration from: /usr/local/src/zookeeper/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
			
2021-04-25 00:15:48,112 [myid:] - INFO [main:QuorumPeerConfig@174] - Reading configuration from: /u ...
 - 5-10  Quartz 任务调度
			
Quartz 什么是Quartz quartz:石英钟的意思 是一个当今市面上流行的高效的任务调度管理工具 由OpenSymphony开源组织开发 Symphony:交响乐 是java编写的,我们使用 ...
 - 基于yum安装CDH集群
			
一.环境准备 准备至少3台设备:CentOS7系统: 如果是在实验环境下,给虚拟机的内存至少4G,根建议1T,数据盘1T,由于是虚拟机,所以根分区和数据盘放心大胆的给:如果是在生产环境则多多益善:我这 ...
 - 如何在Rust中打印变量的类型?
			
#![feature(core_intrinsics)] fn print_type_of<T>(_: T) { println!("{}", unsafe { std ...
 - ora-26002:Informatica的Powercenter跑ETL时,出现ora-26002错误解决办法
			
在使用Informatica进行ETL导数的时候,出现下面的错误: WRT_8229 Database errors occurred: ORA-26002: Table REPORT.TB_JK_0 ...
 - NodeJS & Dapr Javascript SDK 官方使用指南
			
Dapr 是一个可移植的.事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的.无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和开发框架.Dapr 确保开发人员专注 ...
 - 大数据管理系统架构Hadoop
			
Hadoop 起源于Google Lab开发的Google File System (GFS)存储系统和MapReduce数据处理框架.2008年,Hadoop成了Apache上的顶级项目,发展到今天 ...