题目描述
给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1 ,其中 0 表示可以走的路,1 表示不可通过的墙壁。
最初,有一个人位于左上角 (1,1)
处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。
请问,该人从左上角移动至右下角 (n,m)
处,至少需要移动多少次。
数据保证 (1,1) 处和 (n,m) 处的数字为 0 ,且一定至少存在一条通路。
输入格式
第一行包含两个整数 n 和 m 。
接下来 n 行,每行包含 m 个整数(0 或 1 ),表示完整的二维数组迷宫。
输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。
输入样例
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=1e2+10;
typedef pair<int,int> PII;
queue<PII> q;
int a[N][N],b[N][N];//b[N][N]数组不仅代表是否遍历,且代表到此点要多少步
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int n,m;
int bfs()
{
memset(b,-1,sizeof b);
b[1][1]=0;// 第一个位置需要移动的步数为0
q.push({1,1});// 先将(1,1)这个位置存入队列中
while(!q.empty())
{
auto t=q.front();// auto会自动辨认数据的类型
q.pop();
for(int i=0;i<4;i++)
{
int nx=t.first+dx[i],ny=t.second+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&b[nx][ny]==-1&&!a[nx][ny])
{
b[nx][ny]=b[t.first][t.second]+1;
q.push({nx,ny});
}
}
}
return b[n][m];
}
int main ()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
cout<<bfs()<<endl;
return 0;
}