走迷宫保姆级题解
思路
从起点出发,每次扩展相邻的点,若相邻点可到达则到达,把到达的点的状态改为1,同时记录到达该点的距离+1,当到达的点为最后一个点,或者是目标点时,输出点的距离即可。
#include<bits/stdc++.h>
using namespace std;
struct p{//队列存x,y坐标
int x;
int y;
};
queue<p> q;
int n,m;
int g[110][110];//存输入的
int d[110][110];//起点到该点的距离
int xx[4]={0,-1,0,1};//向量方便上下左右判断
int yy[4]={1,0,-1,0};
void bfs()
{
q.push(p{1,1}); //起点入队
g[1][1] = 1; //起点到达改变状态
d[1][1] = 0; //起点到起点的距离为0
while(q.empty()==false) //队不为空
{
int nx=q.front().x; //拿出队头 开始扩展
int ny=q.front().y;
q.pop();
for(int i=0;i<4;i++) //扩展的方向有四个
{
int x=nx+xx[i];
int y=ny+yy[i];
if(g[x][y]==0&&x>=1&&x<=n&&y>=1&&y<=m) //扩展点合法
{
d[x][y] = d[nx][ny] + 1; //到达这一点的距离为上一点的距离+1 因为无权图
g[x][y] = 1; //该点状态锁定
q.push(p{x,y}); //该点入队 用作下次扩展
if(x==n&&y==m) //当达到目标点时,输出目标点的距离 结束
{
cout<<d[n][m];
return;
}
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>g[i][j];
bfs();
return 0;
}