bfs(队列模板)

 

【题目描述】

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。

假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

 

【输入】

第一行是两个整数n和m(1≤n,m≤100),表示迷宫的行数和列数。

接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.’表示空地,‘#’表示墙,‘S’表示起点,‘T’表示出口。

 

【输出】

输出从起点到出口最少需要走的步数。

【输入样例】

3 3
S#T
.#.
...

【输出样例】

6
#include <cstdio>
#include <cstring>
#include<cmath>
#include<algorithm> 
#include<iostream>
#include<queue>
#define P  pair<int,int> 
using namespace std;
char a[105][105];
int dx[5]={-1,1,0,0};
int dy[5]={0,0,1,-1};
int d[105][105],n,m;
int  bfs(int x,int y)
{
    int ex,ey;
    //memset(d,0,sizeof(d));
    queue <P> que;
    que.push(P(x,y));
    while(que.size()>0)
    {
     ex=que.front().first;
     ey=que.front().second;
    que.pop();
    if(a[ex][ey]=='T')
    { 
    return d[ex][ey];
    break;
}
    for(int i=0;i<4;i++)
    {
        int nx=ex+dx[i];
        int ny=ey+dy[i];
        if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&(a[nx][ny]=='.'||a[nx][ny]=='T')&&d[nx][ny]==0)
        {
            que.push(P(nx,ny));
            d[nx][ny]=d[ex][ey]+1;
        }
    }
    }
    return d[ex][ey];
}

int main() {
  int x;
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
      for(int j=1;j<=m;j++)
      cin>>a[i][j]; 
  }
  for(int i=1;i<=n;i++)
  {
      for(int j=1;j<=m;j++)
      if(a[i][j]=='S')
       x=bfs(i,j);
  }
 
  cout<<x<<endl; 
    return 0;
}

 

posted @ 2019-05-16 18:25  hh13579  阅读(316)  评论(0编辑  收藏  举报