AcWing 844. 走迷宫
原题链接
简单
作者:
Yoghurt.
,
2025-03-13 22:58:32
·北京
,
所有人可见
,
阅读 1
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
const int N=110;
int g[N][N],d[N][N]; //g是地图,d是每个点距离起点的距离
typedef pair<int,int> PII; //PII用于存储坐标点
PII q[N*N]; //装队列的数组,元素是坐标点
//a,b是起点
void bfs(int a,int b)
{
memset(d,-1,sizeof d); //初始化d
d[0][0]=0; //初始化起点的d
int hh=0,tt=0; //队头和队尾
q[0]={a,b}; //先让起点进队列
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; //x方向向量,y方向向量
//首先应当知道队列结构,队列为空时,tt+1=hh;
/**
* 整体思路是:让起点先进入队列,然后遍历起点上下左右的点,满足条件的点就进入队列,然后起点出队。
* 后续每次都从队头中取出一点,重复上述操作,直到队列为空
*/
while(hh<=tt) //当队列非空的时候执行
{
auto t=q[hh++]; //在队头取点
for(int i=0;i<4;i++) //四个方向探测
{
int x=t.first+dx[i],y=t.second+dy[i]; //初始化四个方向探测的点
if(x>=0 && y>=0 && x<n && y<m && g[x][y]==0 && d[x][y]==-1) //要求探测的点在边界之内、是能走的路、之前没有走过
{
d[x][y]=d[t.first][t.second]+1; //探测的点到起点的距离+1
q[++tt]={x,y}; //让该点进队
}
}
}
cout<<d[n-1][m-1]; //终点的d存储的就是到起点的距离
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>g[i][j];
}
bfs(0,0);
}