#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#include<queue>
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
int step[150][150];
struct point
{
int x,y;
point(int xx,int yy)
{
x=xx;
y=yy;
}
};
queue<point> q;
int visit[150][150];
static int n,m;
char b[150][150];
int flag=0;
void bfs(int sx,int sy)
{
q.push(point(sx,sy));
visit[sx][sy]=1;
while(q.empty()!=true)
{
point a=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int xxx=a.x+xx[i];
int yyy=a.y+yy[i];
if(xxx<0 || yyy<0 || xxx>n-1 || yyy>m-1 || b[xxx][yyy]=='#' ||visit[xxx][yyy]==1)
continue;
visit[xxx][yyy]=1;
q.push(point(xxx,yyy));
step[xxx][yyy]=step[a.x][a.y]+1; //最重要,bfs第一次走到的即最短路
if(b[xxx][yyy]=='T')
flag=1;
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cin>>b[i][j];
}
memset(visit,0,sizeof(visit));
memset(step,0,sizeof(step));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(b[i][j]=='S')
bfs(i,j);
}
}
if(flag==0)
cout<<-1;
else
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(b[i][j]=='T')
cout<<step[i][j];
}
}
}
注意:进队的时候visit就要置为1了,而不是出队的时候才置。