zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    《编程之美》
    Fx Composer2.5 在Win8.1下无法运行的解决方法
    纹理坐标的探讨
    随机取两个点 ( 容易犯错的 do while )
    X文件(待续)
    函数指针
    安装DirectX SDK时出现Error Code:s1023 的解决方案(转)
    光与材质
    视棱锥
    D3D支持的图元类型
  • 原文地址:https://www.cnblogs.com/hh13579/p/10877276.html
Copyright © 2011-2022 走看看