题目描述
有一天,小哈一个去玩迷宫。但是方向感很不好的小哈很快就迷路了。小哼得知后便立即去解救无助的小哈。小哼当然是有备而来,已经弄清楚了迷宫地图,现在小哼要以最快速度去解救小哈。问题就此开始了…… 迷宫由n×m
列的单元格组成,每个单元格要么是空地,要么是障碍物。你的任务是帮助小哼找到一条从迷宫的起点到小哈所在位置的最短路径,注意障碍物是不能走的,当然也不能走到迷宫之外(n,m≤100)。
输入
第一行有两个数n和m。n表示迷宫的行,m表示迷宫的列。接来下来n行m列为迷宫,0表示空地,1表示障碍物。最后一行4个数,前两个数为迷宫入口的x和y坐标。后两个为小哈的x和y坐标。
输出
一个整数表示小哼到小哈的最短步数。如果不能解救小哈则输出No Way!
样例输入
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
3 3
1 1 1
0 1 0
0 1 0
2 1 3 3
样例输出
7
No Way!
思路:BFS
注意:数组下标,越界判断
#include<bits/stdc++.h>
using namespace std;
struct note
{
int x;
int y;
int f;
int step;
};
int main()
{
struct note que[2505];
int mp[51][51]= {0},book[51][51]= {0};
int next[4][2]= {0,1,1,0,0,-1,-1,0};//方向数组
int head,tail;
int n,m;
while(cin>>n>>m) //数据多组输入
{
int i,j;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
cin>>mp[i][j];
}
}
int startx,starty,p,q;
cin>>startx>>starty>>p>>q;
head=1;
tail=1;
que[tail].x=startx;
que[tail].y=starty;
que[tail].f=0;
que[tail].step=0;
tail++;
book[startx][starty]=1;
int flag;//标记是否到达目标点
flag=0;
int tx,ty;
while(head<tail)
{
for(int k=0; k<=3; k++)
{
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
if(tx<1||tx>n||ty<1||ty>m)
{
continue;
}
if(mp[tx][ty]==0 && book[tx][ty]==0)
{
book[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;
que[tail].f=head;
que[tail].step=que[head].step+1;
tail++;
}
if(tx==p && ty==q)
{
flag=1;
break;
}
}
if(flag==1)break;
head++;
}
if(flag==1)cout<<que[tail-1].step<<endl;
else if(flag==0)
{
cout<<"No Way!"<<endl;
}
}
return 0;
}