#include <iostream>
#include <cstring>
#include <math.h>
#include <queue>
using namespace std;
struct Point
{
int x,y;//坐标
int dire;//现在的朝向
int turn;//转弯次数
};
const int D[4][2]={0,1,1,0,0,-1,-1,0};//右下左上
int n,m;
char mp[1005][1005];
int vis[1005][1005][4]={0};//每个点最少的转弯次数
bool check(int i,int j)
{
return (i>=0&&j>=0&&i<n&&j<m&&mp[i][j]!='*');//判断
}
void bfs(int i,int j)
{
queue<Point> q;
Point tmp;
q.push({i,j,4,0});//dire=4是因为题目说在最开始的时候,Igor的车可以选择任何方向
while(!q.empty())
{
tmp=q.front();q.pop();
if(mp[tmp.x][tmp.y]=='T') {cout<<"YES";return;}//找到了
for(int k=0;k<4;k++)//一个一个试方向
{
if(abs(tmp.dire-k)==2) continue;//不能掉头
int xx=tmp.x+D[k][0];
int yy=tmp.y+D[k][1];
int tt=tmp.turn+(tmp.dire!=k);//计算出走到这一个所需的转弯次数
if(tmp.dire==4) tt=0;//如果是第一次刚开始走,转弯次数为0(是上面的q.push({i,j,4,0});的作用)
if(check(xx,yy)&&vis[xx][yy][k]==-1&&tt<=2)//是否是第一次走到这点
q.push({xx,yy,k,tt}),vis[xx][yy][k]=tt;
if(check(xx,yy)&&vis[xx][yy][k]!=-1&&tt<=2)//若不是第一次走到这点
if(tt<vis[xx][yy][k]) vis[xx][yy][k]=tt,q.push({xx,yy,k,tt});//若转弯次数较少,更新并入队
}
}
cout<<"NO";
}
int main()
{
memset(vis,-1,sizeof(vis));//先全部设为没走过
cin>>n>>m;
int si=0,sj=0;//起点
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>mp[i][j];
if(mp[i][j]=='S') si=i,sj=j;
}
bfs(si,sj);
return 0;
}
WA了第7个点,有没有大佬能帮助一下啊