原题题目:
给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1表示不可通过的墙壁。
最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。
请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。
数据保证 (1,1)处和 (n,m)处的数字为 0,且一定至少存在一条通路。
输入格式
第一行包含两个整数 n 和 m。
接下来 n 行,每行包含 m个整数(0 或 1),表示完整的二维数组迷宫。
输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。
数据范围
1≤n,m≤100
数据范围
1≤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
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n,m;
typedef pair<int,int>PII; //定义一个结构体,存储<int,int>类型的数据
int g[N][N]; //存储图
int d[N][N]; //存储点到起点的距离
void bfs(int a,int b) //a,b为起始位置坐标
{
queue<PII> q; //定义一个PII类型的队列
q.push({a,b}); //把起点放入队列
while(!q.empty()) //判断队列是否为空
{
PII s = q.front(); //取队首元素放入s中
q.pop(); //删除队首元素
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1}; //用向量来模拟四个方向,从acwing上的y总学到的思路
for(int i=0;i<4;i++) //循环4个方向
{
int x = s.first+dx[i],y=s.second+dy[i]; //定义x,y来存储走之后的坐标
if(g[x][y]==0) //如果该点是0(可以走)
{
g[x][y]=1; //把该点转换为1,表示走过
d[x][y]=d[s.first][s.second]+1; //将走过该点的下一个点到起点你的距离存到数组里,因为是下一个点,所以要加1
q.push({x,y}); //将该点放入队列
}
}
}
cout<<d[n][m]; //输出离起点最近距离
}
int main()
{
memset(g,1,sizeof(g)); //将数组初始化,全为一,不知道memset函数怎么用的可以去搜一下
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) //把图存入数组
cin>>g[i][j];
bfs(1,1); //传参,起点位置
}
一.BFS搜索路径(画的有点丑)
二.BFS能找到最短路径的原因
-
逐层搜索:BFS按照节点的层级顺序逐层进行搜索。从起始节点开始,首先搜索到与起始节点直接相邻的节点(第一层),然后再搜索到与这些节点相邻的节点(第二层),依次类推。由于BFS的搜索顺序是逐层的,因此当搜索到目标节点时,路径的长度一定是最短的,即最先找到目标节点的路径一定是最短路径。
-
无环性:BFS在搜索过程中会维护一个“已访问”节点的集合,确保每个节点只被访问一次。由于BFS的特性是先访问距离起始节点最近的节点,然后依次访问离起始节点更远的节点,所以一旦某个节点被访问过,它的最短路径就已经确定,不会再有更短的路径。这种无环性质保证了BFS找到的路径一定是最短路径。
总的来说,BFS之所以能够找到图中节点之间的最短路径,是因为它按层级逐层搜索,并且保证每个节点只被访问一次,从而确保找到的路径是最短的。(注意这个按层搜索,思考和DFS的区别)。
三.DFS与BFS的区别
-
搜索顺序:
- DFS:从起始节点开始,沿着一条路径一直深入直到不能再深入为止,然后回溯到最近的一个未被访问过的节点继续深入,如此往复,直到找到目标节点或者遍历完所有节点。
- BFS:从起始节点开始,首先访问所有与起始节点相邻的节点,然后再依次访问这些相邻节点的相邻节点,以此类推,逐层进行搜索。
-
数据结构:
- DFS:通常使用栈(Stack)来实现,通过递归或迭代的方式实现深度优先搜索。
- BFS:通常使用队列(Queue)来实现,按照先进先出的顺序逐层搜索。
-
搜索路径:
- DFS:找到一条路径后会继续深入搜索,直到遍历完整个图或者找到目标节点。
- BFS:按层级逐层搜索,找到目标节点后即可确定最短路径。
-
适用情况:
- DFS:适用于寻找深度路径,例如拓扑排序、连通性检测等问题。
- BFS:适用于寻找最短路径,例如最短路径问题、最小生成树等(一般边权要相等)。
总的来说:
DFS更适合深度优先搜索,适用于寻找深度路径和遍历整个图;
而BFS更适合广度优先搜索,适用于寻找最短路径和层级遍历。