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

Sample Output

 
  
5

Source


参考代码:

#include
#include
#include
#include
#include
#include
#include
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()
{
	queueq;
	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;
}


你可能感兴趣的:(算法,ACM)