给你一个 n 行 m 列的二维迷宫。'S'表示起点,'T' 表示终点,'#' 表示墙壁,'.' 表示平地。你需要从 'S' 出发走到 'T',每次只能上下左右走动,并且不能走出地图的范围以及不能走到墙壁上。请你计算出走到终点需要走的最少步数。
输入格式
第一行输入 nn, mm 表示迷宫大小。(1≤n,m≤100)
接下来输入 nn 行字符串表示迷宫,每个字符串长度为 m。(地图保证有且仅有一个终点,一个起始点)
输出格式
输出走到终点的最少步数,如果不能走到终点输出 −1,占一行。
样例输入1
2 3
S.#
..T
样例输出1
3
样例输入2
3 3
S.#
.#.
.#T
样例输出2
输入格式
第一行输入 nn, mm 表示迷宫大小。(1≤n,m≤100)
接下来输入 nn 行字符串表示迷宫,每个字符串长度为 m。(地图保证有且仅有一个终点,一个起始点)
输出格式
输出走到终点的最少步数,如果不能走到终点输出 −1,占一行。
样例输入1
2 3
S.#
..T
样例输出1
3
样例输入2
3 3
S.#
.#.
.#T
样例输出2
-1
#include<bits/stdc++.h>
using namespace std;
char mp[105][105];
int vis[105][105]={0};
int dir[][2]={1,0,-1,0,0,1,0,-1};
int n,m;
struct node{
int x,y;
int step;
node(int x,int y,int step){
this->x = x;
this->y = y;
this->step = step;
}
};
int main(){
cin>>n>>m;
int flag=0;
queue<node> q;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>mp[i][j];
if(mp[i][j]=='S'){
node begin = node(i,j,0);
q.push(begin);
vis[i][j] = 1;
}
}
}
while(q.size()){
node x = q.front();
if(mp[x.x][x.y]=='T'){
flag=1;
cout<<x.step<<endl;
break;
}
q.pop();
for(int i=0;i<4;i++){
int dx = x.x+dir[i][0];
int dy = x.y+dir[i][1];
if(dx>=0&&dx<n&&dy>=0&&dy<m&&!vis[dx][dy]&&mp[dx][dy]!='#'){
//cout<<dx<<" "<<dy<<endl;
vis[dx][dy] = 1;
q.push(node(dx,dy,x.step+1));
}
}
}
if(!flag)cout<<"-1"<<endl;
}