★实验任务
有一只小仓鼠身处在一个 N*M 迷宫之中,它现在想知道它最快能什么时候到达出口。
迷宫是由 ‘ . ’ ‘ # ’ 构成,’ . ’表示可以通行,‘#’表示墙壁,不能通行,现在小仓鼠在‘S’的位置上,问到出口’E’的最短时间是多少?
★数据输入
第一行两个整数 n,m(1<n,m<=1000)表示 n 行,m 列
接下来输入一个 n*m 的迷宫(只包含 ’ . ’ , ’ # ’, ’ S ’,’ E ’)
★数据输出
如果能到达则输出最短时间,否则输出-1
输入示例1 |
---|
3 4 .... S.#. .#.E |
输出示例1 |
---|
6 |
输入示例2 |
---|
3 5 ..#.. #S#.E ...#. |
输出示例2 |
---|
-1 |
经典迷宫问题
#include<bits/stdc++.h>
using namespace std;
int flag[1005][1005];
int ans = -1;
int n,m;
char migong[1005][1005];
int dir[4][2]={0,-1,0,1,1,0,-1,0};
struct node{
int x,y;
int dis;
};
void BFS(int xx,int yy)
{
queue<node> q2;
struct node p1,p2,p3;
p1.x = xx;
p1.y = yy;
p1.dis = 0;
q2.push(p1);
while(!q2.empty())
{
p2 = q2.front();
q2.pop();
if(migong[p2.x][p2.y]=='E')
{
ans = p2.dis;
return;
}
flag[p2.x][p2.y] = 1;
for(int i=0;i<4;i++){
p3 =p2;
p3.x+=dir[i][0];
p3.y+=dir[i][1];
if(flag[p3.x][p3.y]!=1&&p3.y<=m&&p3.y>=1&&p3.x>=1&&p3.x<=n&&migong[p3.x][p3.y]!='#'){
p3.dis++;
q2.push(p3);
}
}
}
}
int main()
{
int xx,yy;
cin>>n>>m;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
cin>>migong[i][j];
if(migong[i][j]=='S')
{
xx = i;
yy = j;
}
}
}
BFS(xx,yy);
cout<<ans<<endl;
}