有一天,傻子A一个人去迷宫玩,但是他的方向感并不是很好,所以他很快就迷路了,哎哟喂,这可把他的小伙伴小Z给急死了,小Z得知后立即去解决傻子A,小Z来之前,做足了调研,弄到了迷宫的地图,现在问题来了:小Z要用最快的速度去解救傻子A。小Z拥有的地图是一个n行m列的单元格(0< n , m <= 50),单元格上要么是空地,要么是障碍物,我们的任务是帮小Z找一条从迷宫起点,通往小Z所在位置的最短路径,注意:障碍物是不能走的!小A是不动的,规定0表示空地、1表示障碍物。
样例输入:
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3(前两个为小Z所在位置坐标、后两个是傻子A所在位置)
样例输出:
7
#include<iostream>
#include<queue>
#define MAXN 51
using namespace std;
typedef pair<pair<int,int>,int> point; //存储坐标和步数
queue<point> que;
int mapp[MAXN][MAXN];
bool book[MAXN][MAXN]={false};//记录是否走过
int next[4][2]={
{ 0, 1}
, { 1, 0}
, { 0,-1}
, {-1, 0}
};
int N,M;
int main()
{
cin >> N >> M;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
cin >> mapp[i][j];
}
}
int sx,sy,ex,ey;
cin >> sx >> sy >> ex >> ey ;
point p,p1;
p.first.first=sx; //p存储开始坐标
p.first.second=sy;
p.second=0;
que.push(p);
book[sx][sy]=true;
bool flag=false; //表示没有找到目标点
//队列不为空时,执行下列操作
while(!que.empty())
{
p=que.front();
que.pop();
for(int i=0;i<4;i++)
{
int gx=p.first.first+next[i][0];
int gy=p.first.second+next[i][1];
//判断是否越界
if(gx<1||gx>N||gy<1||gy>M)
{
continue;
}
if(mapp[gx][gy]==0 && book[gx][gy]==false)
{//可以走
book[gx][gy]=true;
p1.first.first=gx;
p1.first.second=gy;
p1.second=p.second+1; //父亲步数加一
que.push(p1);
}
//达到目标点停下来
if(gx==ex && gy==ey)
{
flag=true;
break;
}
}
if(flag)
break;
}
//打印队列末尾最后一个点(目标点)的步数
p1=que.back();
cout << p1.second << endl;
return 0;
}