走出迷宫
现在给你一个迷宫的图纸,图纸中只包含"."、"#"
“.”表示路
“#”表示墙
左上角为入口,右下角为出口
现在问如果可以从入口走到出口的话,直接输出最小距离,如果不能走到,就输出-1
输入
每组数据占多行
第一行包含两个数字n、m(1<=n,m<=100),表示地图大小为n行m列
接下来n行每行m个字符,只包含“.”和“#”
保证入口和出口均为路
输出
每组输出占一行,包含一个整数,表示答案
样例输入
3 4 ..#. #... ##..
样例输出
5
#include<bits/stdc++.h>
using namespace std;
char ch[505][505];//迷宫
int vis[505][505];//标识
int dis[4][2]= {-1,0,0,1,0,-1,1,0};//上下左右
struct node
{
int x,y,step=0;
} A;//当前位置点坐标
int n,m;
bool judge(node xx);
void BFS();
int main()
{
while(cin>>n>>m)
{
for(int i=0; i<n; i++) scanf("%s",ch[i]);//输入迷宫
memset(vis,0,sizeof(vis));//标记数组清零
BFS();
}
return 0;
}
bool judge(node xx)
{
if(xx.x>=0 && xx.x<n && xx.y>=0 && xx.y<m && !vis[xx.x][xx.y] && ch[xx.x][xx.y]!='#')
return true;//这个点,不超过边界、未被标记、且不是障碍物x
return false;
}
void BFS()
{
node start;//左上角起点
start.x=0;
start.y=0;
start.step=0;
queue<node>qu;
while(!qu.empty()) qu.pop();
qu.push(start);
while(!qu.empty())
{
node now=qu.front();
qu.pop();
if(now.x==n-1 && now.y==m-1)
{
printf("%d\n",now.step);//到终点,输出步数
return;
}
for(int i=0; i<4; i++) //判断四个方向能否向下继续走
{
node next;//每次新定义一个node
next.x=now.x+dis[i][0];//[0]是x
next.y=now.y+dis[i][1];//[1]是y
if(judge(next))
{
next.step=now.step+1;//!!每次进行一层BFS,步数加1
qu.push(next);
vis[next.x][next.y]=1;
}
}
}
printf("-1\n");//若栈为空,即当前无路可走,输出-1
}