题目描述

给定一个 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;
}