有一天,傻子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;
}