传送门
爆枚起点,跑一发最短路。求出距离不大于T的最远点对即可。
const d:array [1..4,1..2] of longint=((1,0),(-1,0),(0,-1),(0,1));
var
a,e,f:array [0..51,0..51] of longint;
b,c:array [0..1000005] of longint;
ans,n,m,tt,i,j:longint;
ch:char;
procedure spfa(x,y:longint);
var i,j,h,t,xx,yy,xxx,yyy:longint;
begin
fillchar(f,sizeof(f),10);
fillchar(e,sizeof(e),0);
f[x,y]:=a[x,y]; e[x,y]:=1;
h:=0; t:=1; b[1]:=x; c[1]:=y;
while (h<t) do begin
inc(h); xx:=b[h]; yy:=c[h]; e[xx,yy]:=0;
for i:=1 to 4 do begin
xxx:=xx+d[i,1]; yyy:=yy+d[i,2];
if (xxx>0) and (yyy>0) and (xxx<=n) and (yyy<=m)
and (f[xxx,yyy]>f[xx,yy]+a[xxx,yyy]) then begin
f[xxx,yyy]:=f[xx,yy]+a[xxx,yyy];
if (e[xxx,yyy]=0) then begin inc(t); b[t]:=xxx; c[t]:=yyy; e[xxx,yyy]:=1; end;
end;
end;
end;
for i:=1 to n do
for j:=1 to m do
if (sqr(i-x)+sqr(j-y)>ans) and (f[i,j]<=tt) then ans:=sqr(i-x)+sqr(j-y);
end;
begin
readln(n,m,tt);
for i:=1 to n do
begin
for j:=1 to m do begin read(ch); a[i,j]:=ord(ch)-48; end;
readln;
end;
ans:=0;
for i:=1 to n do
for j:=1 to m do spfa(i,j);
write(sqrt(ans):0:6);
end.