回溯剪枝,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+思维:按照权值的大小,从小的到大的连有 ...
随机推荐
- rhel7修改网卡名
备份eno16777736网卡配置,并复制出一个ifcfg-eth0 [root@rhel7 network-scripts]# cp ifcfg-eno16777736 ifcfg-eno16777 ...
- NC17400 gpa
NC17400 gpa 题目 题目描述 Kanade selected n courses in the university. The academic credit of the i-th cou ...
- Codeforces Round #792 (Div. 1 + Div. 2) A-E
Codeforces Round #792 (Div. 1 + Div. 2) A-E A 题目 https://codeforces.com/contest/1684/problem/A 题解 思路 ...
- 一切皆为字节和字节输出流_OutputStream类&FileOutputStream类介绍
一切皆为字节 一切文件数据(文本.图片.视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此.所以,字节流可以传输任意文件数据.在操作流的时候,我们要时刻明确,无论使用什 ...
- 今天安装了eclipse,myeclipse,满满的回忆
代码半生,编码半世,ideacode失效,安装了eclipse,那熟悉的界面,俨然又回到了从前,当初我们还在用structs,eclipse,webwork,那时候还在用jbuilder,但是算是老套 ...
- static 和 final(java)
static: 1.1static修饰成员变量: 使用static修饰的成员变量不在对象的数据结构,而是类的基本信息(参数) 使用static修饰的成员可以直接使用,类名.成员的方式访问,而不需要再n ...
- springboot connecting to :mongodb://127.0..0.1:27017/test authentication failed
账号的权限不够,可能是insert进去的脚本的角色有问题 use admin db.createUser({user:'账号',pwd:'密码',roles:[{role:'userAdminAnyD ...
- HBase学习(二) 基本命令 Java api
一.Hbase shell 1.Region信息观察 创建表指定命名空间 在创建表的时候可以选择创建到bigdata17这个namespace中,如何实现呢? 使用这种格式即可:'命名空间名称:表名' ...
- efcore在Saas系统下多租户零脚本分表分库读写分离解决方案
efcore在Saas系统下多租户零脚本分表分库读写分离解决方案 ## 介绍 本文ShardinfCore版本x.6.0.20+ 本期主角: - [`ShardingCore`](https://gi ...
- linux 编译式安装nginx
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local ...