思路:由于数据范围比较小,我们直接对于每一个点来求最短路,然后枚举看看移动T个最多能去到哪里就好了
#include<bits/stdc++.h>
using namespace std;
int n,m,t;
int mp[35][35];
double ans = 0;
int d[35][35];
int inq[35][35];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void spfa(int x,int y)
{
for(int i = 0;i<=n;i++)
for(int j = 0;j<=m;j++)
d[i][j]=999999;
memset(inq,0,sizeof(inq));
d[x][y]=mp[x][y];
queue<pair<int,int> > q;
q.push(make_pair(x,y));
inq[x][y]=1;
while(!q.empty())
{
pair<int,int> now = q.front();
q.pop();
inq[now.first][now.second]=0;
for(int i = 0;i<4;i++)
{
int dx = now.first + dir[i][0];
int dy = now.second + dir[i][1];
if(dx<=0 || dx>n || dy<=0 || dy>m)
continue;
if(d[dx][dy]>d[now.first][now.second]+mp[dx][dy])
{
d[dx][dy]=d[now.first][now.second]+mp[dx][dy];
if(!inq[dx][dy])
q.push(make_pair(dx,dy));
inq[dx][dy]=1;
}
}
}
double res = 0;
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++)
{
if(d[i][j] <= t)
res = max(res,sqrt((i-x)*(i-x)+(j-y)*(j-y)));
}
ans = max(res,ans);
}
int main()
{
scanf("%d%d%d",&n,&m,&t);
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++)
{
char c;
scanf(" %c",&c);
mp[i][j]=c-'0';
}
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++)
spfa(i,j);
printf("%.6lf\n",ans);
}