95分,一点TLE
#include<bits/stdc++.h>
using namespace std;
const int maxn=351+10;
const int maxm=351+10;
const int maxys=21+10;
const int maxcy=21+10;
const int INF=0x3f3f3f3f;
const int dx[8]={-1,1,0,0,-1,1,1,-1};
const int dy[8]={0,0,-1,1,-1,1,-1,1};
int n,m,zys,zsy,d;
int sx,sy,ex,ey;
char maze[maxn][maxm];
bool saw[maxn][maxm],vis[maxn][maxm][maxys][maxcy];
struct node
{
int x,y,step;
int ys,sy;
};
node ans=(node){0,0,INF,INF,INF};
queue <node> q;
void find(int num,int x,int y)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(abs(x-i)+abs(y-j)<num) saw[i][j]=true;
}
node com(node a,node b)
{
if(a.step!=b.step) return a.step<b.step?a:b;
if(a.ys+a.sy!=b.ys+b.sy) return a.ys+a.sy<b.ys+b.sy?a:b;
return a.ys<b.ys?a:b;
}
bool check(int nx,int ny)
{
if(nx<1 || nx>n || ny<1 || ny>m) return false;
if(maze[nx][ny]=='R') return false;
return true;
}
void bfs()
{
q.push((node){sx,sy,0,0,0});
while(!q.empty())
{
node u=q.front();
q.pop();
if(u.step>ans.step) continue;
if(u.x==ex && u.y==ey) {ans=com(ans,u);continue;}
for(int i=0;i<8;i++)
{
int nx=u.x+dx[i];
int ny=u.y+dy[i];
if(!check(nx,ny)) continue;
if(saw[nx][ny])
{
if(vis[nx][ny][u.ys+1][u.sy] || u.ys+1>zys) continue;
vis[nx][ny][u.ys+1][u.sy]=true;
q.push((node){nx,ny,u.step+1,u.ys+1,u.sy});
}
else
{
if(vis[nx][ny][u.ys][u.sy]) continue;
vis[nx][ny][u.ys][u.sy]=true;
q.push((node){nx,ny,u.step+1,u.ys,u.sy});
}
}
if(u.sy+1>zsy) continue;
for(int i=0;i<4;i++)
{
int nx=u.x+dx[i]*d;
int ny=u.y+dy[i]*d;
if(!check(nx,ny)) continue;
if(saw[nx][ny])
{
if(vis[nx][ny][u.ys+1][u.sy+1] || u.sy+1>zsy) continue;
vis[nx][ny][u.ys+1][u.sy+1]=true;
q.push((node){nx,ny,u.step+1,u.ys+1,u.sy+1});
}
else
{
if(vis[nx][ny][u.ys][u.sy+1]) continue;
vis[nx][ny][u.ys][u.sy+1]=true;
q.push((node){nx,ny,u.step+1,u.ys,u.sy+1});
}
}
}
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&zys,&zsy,&d);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
string s;
cin>>s;
if(s=="S") {sx=i;sy=j;maze[i][j]='.';vis[i][j][0][0]=true;}
else
if(s=="T") {ex=i;ey=j;maze[i][j]='.';}
else
if(s==".") maze[i][j]='.';
else
{
int num=0;
int len=s.size();
for(int k=0;k<len;k++)
num=num*10+(s[k]-'0');
find(num,i,j);
maze[i][j]='R';
}
}
bfs();
if(ans.step==INF) printf("-1");
else printf("%d %d %d",ans.step,ans.ys,ans.sy);
return 0;
}