我们可以枚举每个点,然后求出这个点到其余点最小消耗的代价,求出比t小的且距离最大的更新答案。
/**************************************************************
Problem: 1295
User: BLADEVIL
Language: C++
Result: Accepted
Time:4572 ms
Memory:3944 kb
****************************************************************/ //By BLADEVIL
#include <cmath>
#include <cstdio>
#include <cstring>
#define maxn 400 using namespace std; int n,m,T;
char s[maxn];
int map[maxn][maxn],quex[maxn*maxn],quey[maxn*maxn],dis[maxn][maxn],flag[maxn][maxn];
int go[][];
double ans; double max(double a,double b) {
if (a>b) return a; else return b;
} int main() {
go[][]=go[][]=-; go[][]=go[][]=;
scanf("%d%d%d",&n,&m,&T);
for (int i=;i<=n;i++) {
scanf("%s",s+);
for (int j=;j<=m;j++) map[i][j]=s[j]!=''?:;
}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) {
memset(dis,,sizeof dis);
memset(flag,,sizeof flag);
quex[]=i; quey[]=j; dis[i][j]=(map[i][j]==);
int h(),t();
while (h<t) {
h=(h%)+;
int curx(quex[h]),cury(quey[h]);
flag[curx][cury]=;
for (int k=;k<=;k++) {
int nx(curx+go[k][]),ny(cury+go[k][]);
if ((nx<)||(nx>n)||(ny<)||(ny>m)) continue;
if (dis[curx][cury]+(map[nx][ny]==)<dis[nx][ny]) {
dis[nx][ny]=dis[curx][cury]+(map[nx][ny]==);
if (!flag[nx][ny]) {
t=(t%)+;
quex[t]=nx; quey[t]=ny;
flag[nx][ny]=;
}
}
}
}
for (int ii=;ii<=n;ii++)
for (int jj=;jj<=m;jj++) if (dis[ii][jj]<=T) ans=max(ans,(ii-i)*(ii-i)+(jj-j)*(jj-j));
}
ans=sqrt(ans);
printf("%.6f\n",ans);
return ;
}