1254:走出迷宫
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 1829 通过数: 853
【题目描述】
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
【输入】
第一行是两个整数n和m(1≤n,m≤100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.’表示空地,‘#’表示墙,‘S’表示起点,‘T’表示出口。
【输出】
输出从起点到出口最少需要走的步数。
【输入样例】
3 3
S#T
.#.
…
【输出样例】
6
#include<iostream>
#include<cstring>
using namespace std;
bool a[101][101],v[101][101];
int qi[100001],qj[100001],qans[100001];
int dis[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int main()
{
int n,m,si,sj,ei,ej;
memset(a,false,sizeof(a));
memset(v,false,sizeof(v));
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
char c;
cin>>c;
if(c=='.')
a[i][j]=true;
if(c=='S')
{
si=i;
sj=j;
a[i][j]=true;
}
if(c=='T')
{
ei=i;
ej=j;
a[i][j]=true;
}
}
int head=0,tail=1;
qi[0]=si;
qj[0]=sj;
v[si][sj]=true;
while(head!=tail)
{
int x=qi[head];
int y=qj[head];
int ans=qans[head];
if(x==ei&&y==ej)
{
cout<<ans<<endl;
break;
}
head++;
for(int i=0;i<4;i++)
{
int nx=x+dis[i][0];
int ny=y+dis[i][1];
if(a[nx][ny]&&nx<=n&&ny<=m&&nx&&ny&&!v[nx][ny])
{
v[nx][ny]=true;
qi[tail]=nx;
qj[tail]=ny;
qans[tail]=ans+1;
tail++;
}
}
}
return 0;
}