1. 双向bfs适用于知道起点和终点的状态下使用,从起点和终点两个方向开始进行搜索,可以非常大的提高单个bfs的搜索效率
  2. 同样,实现也是通过队列的方式,可以设置两个队列,一个队列保存从起点开始搜索的状态,另一个队列用来保存从终点开始搜索的状态,如果某一个状态下出现相交的情况,那么就出现了答案

用一张图来进行说明
当两种颜色相遇的时候,说明两个方向的搜索树遇到一起,这个时候就搜到了答案。

例题1:走迷宫

问题描述:
一个迷宫由 R R R行 C C C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。
给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。

输入

第一行是两个整数, R R R和 C C C,代表迷宫的长和宽。 ( 1 ≤ R , C ≤ 40 ) ( 1≤ R,C ≤ 40) (1≤R,C≤40)
接下来是 R R R行,每行 C C C个字符,代表整个迷宫。
空地格子用‘.’表示,有障碍物的格子用‘#’表示。
迷宫左上角和右下角都是‘.’。

输出

输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。

样例输入

5 5
..###
#....
#.#.#
#.#.#
#.#..

样例输出

9

代码如下:

#include <iostream>
#include <queue>
using namespace std;
int r, c;
const int N = 45;
char mp[N][N];
typedef pair<int, int>PII;
#define x first
#define y second
int vis[N][N];
int flag;
int dis[N][N];
int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};int dbfs() {queue<PII>q1, q2;//q1为从前往后搜,q2为从后往前搜dis[1][1] = 1;dis[r][c] = 1;vis[1][1] = 1;//q1标记为1vis[r][c] = 2;//q2标记为2//如果某状态下,当前节点和准备扩展节点的状态相加为3,//说明相遇q1.push({1, 1});q2.push({r, c});PII t;while (q1.size() && q2.size()) {if (q1.size() < q2.size()) {每次扩展搜索树小的队列 flag=1表示从前往后搜的队列,flag=0表示从后往前搜的队列t = q1.front();q1.pop();flag = 1;//q1标记为1} else {t = q2.front();q2.pop();flag = 0;//q2标记为0}for (int i = 0; i < 4; i++) {int xx = t.x + dx[i];int yy = t.y + dy[i];if (xx >= 1 && xx <= r && yy >= 1 && yy <= c && mp[xx][yy] == '.')if (!dis[xx][yy])if (flag) {vis[xx][yy] = 1;dis[xx][yy] = dis[t.x][t.y] + 1;q1.push({xx, yy});} else {vis[xx][yy] = 2;dis[xx][yy] = dis[t.x][t.y] + 1;q2.push({xx, yy});} else {if (vis[xx][yy] + vis[t.x][t.y] == 3)//相遇 {return dis[xx][yy] + dis[t.x][t.y];}}}}return -1;
}int main() {cin >> r >> c;for (int i = 1; i <= r; i++)for (int j = 1; j <= c; j++)cin >> mp[i][j];cout << dbfs() << endl;return 0;
}

参考文章链接:https://blog.csdn.net/weixin_43501684/article/details/90147421

走迷宫-双向bfs解法相关推荐

  1. 【算法】机器人走迷宫破壁解法(适用于走迷宫、最短路径算法)-20200412

    标题:机器人走迷宫破壁解法(适用于走迷宫.最短路径算法)-20200412 问题描述: 一块矩形方格,含有障碍和可通行格子,求从某一点到另外一点的最短距离?N*M的矩阵: 其中,1代表障碍,0代表可通 ...

  2. Bailian3752 走迷宫【BFS】

    3752:走迷宫 总时间限制: 1000ms 内存限制: 65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少 ...

  3. 【含泪总结】大胖子走迷宫(bfs+读懂题意)

    2548. 大胖子走迷宫 小明是个大胖子,或者说是个大大胖子,如果说正常人占用 1×1 的面积,小明要占用 5×5 的面积. 由于小明太胖了,所以他行动起来很不方便. 当玩一些游戏时,小明相比小伙伴就 ...

  4. 2548. 大胖子走迷宫 (时间bfs)

    小明是个大胖子,或者说是个大大胖子,如果说正常人占用 1×1 的面积,小明要占用 5×5 的面积. 由于小明太胖了,所以他行动起来很不方便. 当玩一些游戏时,小明相比小伙伴就吃亏很多. 小明的朋友们制 ...

  5. 小白月赛26:E牛牛走迷宫(BFS)

    题目链接小白月赛26 牛牛走迷宫 题目大意 一个n行,m列的只包含0和1矩阵,0表示可以走,1表示不能走.,从{1,1}开始移动,一次移动一格,可以向上下左右移动,条路径步数一样,他会选择走字典序最小 ...

  6. 算法基础课——走迷宫(BFS)

    走迷宫 问题描述 给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁. 最初,有一个人位于左上角 (1,1) 处,已知该人每 ...

  7. 【牛客 - 330C】Applese 走迷宫(bfs)

    题干: 精通程序设计的 Applese 双写了一个游戏. 在这个游戏中,它被困在了一个 n×mn×m 的迷宫中,它想要逃出这个迷宫. 在迷宫中,有一些方格是水池,只有当 Applese 处于水属性的时 ...

  8. 深度优先搜索和广度优先搜索及典例分析(走迷宫问题(BFS)和棋盘问题(DFS))

    搜索算法在实际编程应用中起着举足轻重的作用,学会掌握搜索算法并熟练应用搜索算法来解决实际问题不得不说是一件相当COOL的事,所以我将深度搜索和广度搜索认真地做了详细的总结,与诸君共勉,也方便以后查阅复 ...

  9. 机器人走迷宫(python解法)

    一.题目 二.解题思路 首先是对自己的一个思路描述,首先只是想判断四周是否为存在0,然后不断顺着0的位置一路走下去,当出现四周没有1时,在从原本的位置倒退一格,但是发现这样的结果会忽略很多条路径,因此 ...

最新文章

  1. 移动端打开html控制台,移动端中使用调试控制台 eruda
  2. AI神经网络如何辨别事物
  3. ROS学习之包的概念
  4. [Everyday Mathematics]20150107
  5. 关于HTTP协议及SOCKET通信
  6. 从概念到案例:初学者须知的十大机器学习算法
  7. javax.servlet.ServletException: 实例化Servlet类[com.wk.web.RegisterServlet]异常
  8. usb端点轮询_使用Spring Integration轮询http端点
  9. mysql 40014无效_Oracle 问题-ORA-14400: 插入的分区关键字未映射到任何分区
  10. 使用git将code同时提交github,gitee,coding
  11. lua语言和python_[动态语言]python和lua中的三元操作符and-or
  12. Cannot get a connection, pool exhausted, cause: ValidateObject failed
  13. C# 10 的五大新功能
  14. 第一个python代码
  15. 有关scm和check style的pom.xml文件
  16. 文明4 java_文明4主题曲《Baba Yetu》(敬请关注中文歌词部分~)
  17. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十四:SD卡模块
  18. 手机微信连不上wifi服务器怎么回事,微信连不上wifi怎么办?
  19. ftm国际化解决方案
  20. 相似度计算(2)——皮尔逊相关系数

热门文章

  1. 【数据结构与算法】多种语言(VB、C、C#、JavaScript)系列数据结构算法经典案例教程合集目录
  2. LeetCode之Number Complement
  3. linux之vim怎么跳到指定的一行
  4. Android之放大镜实现的两种方式
  5. vue data数据修改_Vue 超清晰思维导图(7张),详细知识点梳理!
  6. ftp 断点续传 Android,Android使用FTP实现断点续传
  7. 亲一下就搞定的事,绝不花钱解决!
  8. 中国人数学好,数学思维差?
  9. linux awk命令总结
  10. seata xid是什么_使用Seata彻底解决Spring Cloud中的分布式事务问题!