拯救小p_广度优先搜索算法


拯救小P

题目描述

在一个 N×M ( 1 ≤ N, M ≤ 100 )的迷宫里,小P被困在了迷宫的某个位置。迷宫由空地(用 0 表示)和墙壁(用 1 表示)组成。小P可以在1个单位时间内从当前位置移动到上下左右四个相邻的空地上。迷宫的左上角坐标为 (0, 0) ,右下角坐标为 (N - 1, M - 1) 。现在给出迷宫的布局以及小P的初始位置 (x, y) ,请你计算小P最少需要多少时间才能走出迷宫(走出迷宫的标志是到达迷宫的右下角)。如果小P无法走出迷宫,输出 -1 。

输入格式

第一行输入两个整数 N 和 M ,表示迷宫的行数和列数。 第二行输入两个整数 x 和 y ,表示小P的初始位置。 接下来 N 行,每行 M 个整数,每个整数为 0 或 1 ,表示迷宫的布局。

输出格式

输出一个整数,表示小P走出迷宫最少需要的时间,若无法走出迷宫,输出 -1 。

样例输入

5 5 0 0 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

广度优先搜索算法解释:

广度优先搜索(Breadth - First Search,BFS)是一种用于图形数据结构(在C++ 中可以是图或者树等)的遍历算法。

基本原理

  • 从给定的起始顶点开始,首先访问起始顶点,然后依次访问起始顶点的所有未访问邻接顶点,这些邻接顶点构成了第一层。接着,对第一层的每个顶点,访问它们未被访问的邻接顶点,这些顶点构成第二层,以此类推。就像以起始顶点为中心,一层一层地向外扩散访问顶点,直到所有可达顶点都被访问完。

实现方式

  • 通常使用队列( queue )这种数据结构来辅助实现。把起始顶点放入队列,然后每次取出队首顶点,访问它的邻接顶点,并将未访问的邻接顶点放入队列,直到队列为空。
  • 例如,假设有一个简单的迷宫(可以抽象为一个图),从起点开始寻找出口。把起点放入队列,然后取出起点,检查它上下左右能到达的点(未访问的空点),放入队列,接着不断从队列取出点进行相同操作,按照距离起点由近到远的顺序进行搜索,先找到出口就可以计算出最短路径长度(如果每步长度为1的话)。

时间复杂度

  • 对于具有 V 个顶点和 E 个边的图,在最坏情况下,广度优先搜索的时间复杂度是 O(V + E)。因为每个顶点和边都可能被访问一次。

应用场景

  • 主要用于寻找最短路径(在边权值相同的情况下)。例如在游戏地图中计算角色从一个点到另一个点的最短路线,在网络拓扑结构中查找两个节点之间的最短连接路径等;也用于图的连通分量的判断等