BFS:迷宫最短路径

简介: BFS:迷宫最短路径

    我们用一个二维的字符数组来表示迷宫;其中字符 S 表示起点,字符 T 表示终点,字符 * 表示墙壁,字符 . 表示平地。你需要从S出发走到T,每次只能向上下左右相邻的位置移动,不能走出地图,也不能穿过墙壁,每个点只能通过一次。你需要编程来求解出一种从起点到终点路程最短走法。无法到达终点输出-1;


输入的第一行为两个整数,表示迷宫的行数和列数,中间用空格分开。下面每行为迷宫每行的样子。


样例输入:

5 6
....S*
.**...
.*..*.
*..**.
.T....

样例输出:

7
#include <iostream>
#include <queue>          //队列,STL队列库,先进先出类型
using namespace std;
int n,m;
char a[105][105];
int b[4][2]={{-1,0},{0,-1},{1,0},{0,1}};   //迷宫上左下右四个方向移动
bool c[105][105];     
                         //记录有无过进入队列
bool in(int x,int y){
  return x>=0 && x<n && y>=0 && y<m; 
}
struct node{            //定义结构体node,x,y代表位置,d代表步数
  int x,y,d;
  node(int xx,int yy,int dd){
    x=xx;           //结构体构造函数,便于赋值
    y=yy;
    d=dd;
  }
};
int bfs(int x,int y){
  queue<node> now;  //定义一个队列,内部时node类型的结构体
  c[x][y]=1;
  now.push(node(x,y,0));  //进入队列
  while(!now.empty()){    //当队列为空时结束循环
    node dange=now.front();  //得到队首
    now.pop();               //弹出队首
    for(int i=0;i<4;i++){
      int tx=dange.x+b[i][0];
      int ty=dange.y+b[i][1];  //四个方向移动;
      if(in(tx,ty)&&a[tx][ty]!='*'&&!c[tx][ty]){  //判断是否可以移动
        if(a[tx][ty]=='T'){
          return dange.d+1;   //如果到达终点返回步数
        }else{
          c[tx][ty]=1;       //没有到达终点,把四个方向(可行的)加入队列
          now.push(node(tx,ty,dange.d+1));
        }
      }
    }
  }
  return -1;
}
int main(){
  int qx,qy;
  cin>>n>>m;
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      cin>>a[i][j];
    }
  }
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      if(a[i][j]=='S'){
        qx=i;
        qy=j;
      }
    }
  }
  cout<<bfs(qx,qy);
  return 0;
}

BFS广度优先搜索,每次优先搜索最近的节点,与DFS一条路走到黑形成鲜明对比。

相关文章
|
7月前
|
存储 算法
使用 BFS 解决走迷宫问题
使用 BFS 解决走迷宫问题
84 1
|
7月前
|
算法 Java C++
走迷宫(BFS)
走迷宫(BFS)
49 0
|
算法 Python
使用深度优先搜索算法解决迷宫问题
迷宫问题是一个经典的算法问题,涉及到通过一个迷宫找到从起点到终点的路径。在本篇博客中,我们将探讨如何使用深度优先搜索(DFS)算法来解决迷宫问题。
335 2
|
存储 算法
秒懂算法 | BFS与最短路径
搜索包括BFS和DFS,这两种算法是算法竞赛的基础。本篇介绍BFS的扩展应用。
581 0
秒懂算法 | BFS与最短路径
|
Java
BFS广度优先遍历——Acwing 844. 走迷宫
BFS广度优先遍历——Acwing 844. 走迷宫
86 0
|
算法 定位技术
算法 | 广度优先遍历BFS
算法 | 广度优先遍历BFS
102 0
|
定位技术 C++
基于c++深度优先遍历迷宫
基于c++深度优先遍历迷宫
148 0
基于c++深度优先遍历迷宫
|
机器学习/深度学习 存储
图的遍历 无向图深搜 宽搜
图的遍历 无向图深搜 宽搜
图的遍历 无向图深搜 宽搜