#include<bits/stdc++.h>
using namespace std;
int n,m,c1,c2,dd,i,j,bj[352][352],sx,sy,zx,zy,w,x,y,u,v,xx,yy,k,a[352][352],b[352][352];
int ans[352][352][17][17],ansmin=1.5e9,ansu,ansv;
int c[12]={0,1,-1,0,0,1,1,-1,-1};
int d[12]={0,0,0,1,-1,1,-1,1,-1};
vector<int>t[352];
char ch;
queue<int>q;
int main()
{
// freopen("3.in","r",stdin);
cin>>n>>m>>c1>>c2>>dd;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{ch=getchar();
while(ch!='S'&&ch!='T'&&ch!='.'&&(ch<48||ch>57))ch=getchar();
if(ch=='S')sx=i,sy=j;
else if(ch=='T')zx=i,zy=j;
else while(ch>=48&&ch<=57){a[i][j]=a[i][j]*10+ch-48;ch=getchar();}
if(a[i][j])t[a[i][j]].push_back(i*1000+j);//记录a[i][j]值与所在的位置
}
for(i=350;i>=1;i--)//从大到小枚举
for(j=0;j<t[i].size();j++)//千万不要写出j<=t[i].size()-1
{x=t[i][j]/1000,y=t[i][j]%1000;//得出当前最大的a[][]值所在的位置
if(bj[x][y]==0)//第一次使用该点
{bj[x][y]=1;b[x][y]=i;//标记该点,记录关键点,判断是否被观察到
for(k=1;k<=4;k++)
{xx=x+c[k],yy=y+d[k];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&bj[xx][yy]==0)
t[i-1].push_back(xx*1000+yy);//把扩展后的符合要求的点加入到动态数组
}
}
}
q.push(0*100000000+0*1000000+sx*1000+sy);//起始点插入到队列中
memset(ans,63,sizeof(ans));ans[sx][sy][0][0]=0;
while(q.size())
{w=q.front();u=w/100000000%10;v=w/1000000%10;x=w/1000%1000;y=w%1000;q.pop();
// if(x==zx&&y==zy)cout<<ans[x][y][u][v]<<" ";
if(x==zx&&y==zy&&(ans[x][y][u][v]<ansmin||(ans[x][y][u] [v]==ansmin&&u+v<ansu+ansv)||(ans[x][y][u][v]==ansmin&&u+v==ansu+ansv&&u<ansu))){ansmin=ans[x][y][u][v];ansu=u;ansv=v;}//更新答案
if(ans[x][y][u][v]<ansmin)//答案优化,
{for(i=1;i<=8;i++)//直接走
{xx=x+c[i],yy=y+d[i];//b[][]==0表示该点卫兵探测不到,不需要隐身,
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==0&&b[xx][yy]==0&&ans[xx][yy][u][v]>ans[x][y][u][v]+1)
{q.push(u*100000000+v*1000000+xx*1000+yy);ans[xx][yy][u][v]=ans[x][y][u][v]+1;}
}
if(u+1<=c1)//隐身
for(int i=1;i<=8;i++)
{xx=x+c[i],yy=y+d[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==0&&ans[xx][yy][u+1][v]>ans[x][y][u][v]+1)
{q.push((u+1)*100000000+v*1000000+xx*1000+yy);ans[xx][yy][u+1][v]=ans[x][y][u][v]+1;}
}
if(v+1<=c2)//瞬移
for(int i=1;i<=4;i++)
{xx=x+c[i]*dd,yy=y+d[i]*dd;
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==0&&b[xx][yy]==0&&ans[xx][yy][u][v+1]>ans[x][y][u][v]+1)
{q.push(u*100000000+(v+1)*1000000+xx*1000+yy);ans[xx][yy][u][v+1]=ans[x][y][u][v]+1;}
}
if(u+1<=c1&&v+1<=c2)//瞬移+隐身
for(int i=1;i<=4;i++)
{xx=x+c[i]*dd,yy=y+d[i]*dd;
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==0&&ans[xx][yy][u+1][v+1]>ans[x][y][u][v]+1)
{q.push((u+1)*100000000+(v+1)*1000000+xx*1000+yy);ans[xx][yy][u+1][v+1]=ans[x][y][u][v]+1;}
}
}
}
if(ansmin>10000000)cout<<-1;
else cout<<ansmin<<" "<<ansu<<" "<<ansv;
return 0;
}
```格式太难调了.....后面把他全部顶格算了,抱歉