迷宫(二)--计蒜客-BFS解法

题目链接:https://nanti.jisuanke.com/t/T1596
题目 :
蒜头君在你的帮助下终于逃出了迷宫,但是蒜头君并没有沉浸于喜悦之中,而是很快的又陷入了思考,从这个迷宫逃出的最少步数是多少呢?
输入格式
第一行输入两个整数 n 和 m,表示这是一个 n×m 的迷宫。
接下来的输入一个 n 行 m 列的迷宫。其中 ‘S’表示蒜头君的位置,’‘表示墙,蒜头君无法通过,’.‘表示路,蒜头君可以通过’.'移动,'T’表示迷宫的出口(蒜头君每次只能移动到四个与他相邻的位置——上,下,左,右)。
输出格式
输出整数,表示蒜头君逃出迷宫的最少步数,如果蒜头君无法逃出迷宫输出 −1。
数据范围
1≤n,m≤10。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
3 4
S
**.
. …
***T
样例输出
5

#include
#include
#include
#include
#include
#include
typedef long long LL;
using namespace std;
struct Node
{
    int x,y,step;
    Node(int xx,int yy,int ss):x(xx),y(yy),step(ss){ }
};
queue<Node> q;
int visited[20][20];
int n,m,qx,qy,zx,zy;
char maze[20][20];
int dx[5]={0,0,-1,1};
int dy[5]={-1,1,0,0};
int main()
{
    cin >> n >> m;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin >> maze[i][j];
            if(maze[i][j]=='S'){
                qx = i;qy = j;
            }
            if(maze[i][j]=='T'){
                zx = i;zy = j;
            }
        }
    }
    q.push(Node(qx,qy,0));
    while(!q.empty()){
        Node s = q.front();
        if(s.x==zx&&s.y==zy){
            cout << s.step;
            return 0;
        }
        else {
            for(int i=0;i<4;i++){
                int xx = s.x+dx[i];
                int yy = s.y+dy[i];
                if(xx>=0&&yy>=0&&xx<n&&yy<m&&!visited[xx][yy]&&maze[xx][yy]!='*'){
                    visited[xx][yy] = 1;
                    q.push(Node(xx,yy,s.step+1));
                }
            }
        }
        q.pop();
    }
    cout << "-1" << endl;
    return 0;
}

你可能感兴趣的:(BFS)