zjnu 1450 - 迷宮(BFS)解題報告


迷宮

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'表示目的地,
'#'表示該方格不能通過
'.'表示可以通過

Output

輸出一個整數表示機器人到達目的地的最短時間,如果機器人不能到達目的地,輸出-1。

Sample Input

 
3 3S..##..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;
}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com