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