迷宫
Case Time Limit:1000MS
Time Limit: 10000MS | Memory Limit: 65536K | |||
Total Submissions: 48 | Accepted: 23 |
Description
小C最近在研究机器人,他想看看自己的机器人够不够智能,于是他将机器人放在一个n*m的迷宫中,看看机器人能不能在最短的时间内到达目的地,可是小C不知道最短的时间是多少,现在请你帮他算算机器人到达目的地的最短时间是多少?
Input
输入数据第一行两个整数n和m。
接下来n行,每行m个元素,表示迷宫的每个方格。
'S'表示机器人的出发点,
'T'表示目的地,
'#'表示该方格不能通过
'.'表示可以通过
接下来n行,每行m个元素,表示迷宫的每个方格。
'S'表示机器人的出发点,
'T'表示目的地,
'#'表示该方格不能通过
'.'表示可以通过
Output
输出一个整数表示机器人到达目的地的最短时间,如果机器人不能到达目的地,输出-1。
Sample Input
3 3 S.. ##. .T.
Sample Output
5
Source
参考代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
struct node
{
int x,y,step;
}s;
int n,m;
int vis[1000][1000];
char mp[1000][1000];
int dis[4][2]={1,0,-1,0,0,1,0,-1};
int bfs()
{
queue<node>q;
node next,p,e;
p.x=s.x;
p.y=s.y;
p.step=0;
int i;
vis[p.x][p.y]=1;
q.push(p);
while(!q.empty())
{
e=q.front();
q.pop();
if(mp[e.x][e.y]=='T')
return e.step;
for(i=0;i<4;i++)
{
next.x=e.x+dis[i][0];
next.y=e.y+dis[i][1];
if(mp[next.x][next.y]=='T')
return e.step+1;
if(mp[next.x][next.y]=='.'&&vis[next.x][next.y]==0&&next.x>0&&next.x<=n&&next.y>0&&next.y<=m)
{
vis[next.x][next.y]=1;
next.step=e.step+1;
q.push(next);
}
}
}
return 0;
}
int main()
{
while(~scanf("%d%d%*c",&n,&m))
{
memset(vis,0,sizeof(vis));
memset(mp,0,sizeof(mp));
int i,j;
for(i=1;i<=n;i++)
{
scanf("%s",mp[i]+1);
for(j=1;j<=m;j++)
{
if(mp[i][j]=='S')
{
s.x=i;
s.y=j;
}
}
}
int ans=bfs();
if(ans==0)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}