rt,没什么实力
不知道为啥 SPFA 可以过
#include<bits/stdc++.h>
using namespace std;
const int N=305;
const int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
#define pii pair<int,int>
#define mp make_pair
int inline read()
{
int num=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
return num*f;
}
int h,w,n,sx,sy,ex,ey;
char s[N][N];bool vis[N][N];
int a[N][N],dis[N][N];
queue<pii>q;
int main(){
h=read();w=read();
for(int i=1;i<=h;i++)
{
scanf("%s",s[i]+1);
for(int j=1;j<=w;j++)
{
if(s[i][j]=='S')sx=i,sy=j;
if(s[i][j]=='T')ex=i,ey=j;
}
}
n=read();
for(int i=1,x,y;i<=n;i++)x=read(),y=read(),a[x][y]=read();
dis[sx][sy]=a[sx][sy];q.push(mp(sx,sy));
while(!q.empty())
{
pii t=q.front();q.pop();
int x=t.first,y=t.second;vis[x][y]=0;
if(!dis[x][y])continue;
for(int i=0;i<4;i++)
{
int xx=x+dx[i],yy=y+dy[i];
if(xx<1||yy<1||xx>h||yy>w||s[xx][yy]=='#')continue;
int ww=max(a[xx][yy],dis[x][y]-1);
if(dis[xx][yy]<ww)
{
dis[xx][yy]=ww;
if(!vis[xx][yy])vis[xx][yy]=1,q.push(mp(xx,yy));
}
if(xx==ex&&yy==ey)return printf("Yes"),0;
}
}
printf("No");
return 0;
}