为什么每次跟自己说,小心点数据范围= - =却总是不尽人意...这题是个bfs的好题(因为跟以前的bfs有很大的不同)
因为限制是2所以直接做两次bfs即可,第一次拿起点做,把可以拐一次就到的点更新,第二次拿可以拐一次就到的点做bfs,再拐一次,把拐两次可以到的点更新,最后判断更新了终点没有,更新了就输出yes/.(类似迭代加深..)
代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int f[N][N],n,m;
char a[N][N];
struct vv{
    int x,y,op;
};
vv start;
void debug()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cout<<f[i][j]<<' ';
        }
        cout<<endl;
    }cout<<endl;
}
void bfs(vv lpt)
{
    int ops=lpt.op,tx=lpt.x,ty=lpt.y,dx=tx,dy=ty;
    f[tx][ty]=ops;
    tx=dx+1,ty=dy;
    while(tx<=n&&a[tx][ty]!='*'&&!f[tx][ty]) { f[tx][ty]=ops,tx++;}
    tx=dx-1,ty=dy;
    while(tx>0&&a[tx][ty]!='*'&&!f[tx][ty]) { f[tx][ty]=ops,tx--;}
    tx=dx,ty=dy+1;
    while(ty<=m&&a[tx][ty]!='*'&&!f[tx][ty]) {f[tx][ty]=ops,ty++;}
    tx=dx,ty=dy-1;
    while(ty>0&&a[tx][ty]!='*'&&!f[tx][ty]) { f[tx][ty]=ops,ty--;}
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>a[i][j];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]=='S')
            {
                start={i,j,1};
            }
        }
    }
    bfs(start);//更新一次.
    //debug();
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(f[i][j]==1)
            {
                bfs({i,j,2});
            }
        }
    }
    //debug();
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(f[i][j]==2)
            {
                bfs({i,j,3});
            }
        }
    }
    int flag=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]=='T')
            {
                if(f[i][j]!=0) flag=1;
            }
        }
    }
    flag==1?puts("YES"):puts("NO");
    return 0;
}

呜呜呜,妈妈我好菜