样例输入
6 8 4
11111001
11001001
00101001
10010001
10000001
11111111
样例输出
11111001
11001001
22101221
12212221
12222221
11111111
数据范围限制
【数据范围】
20%的数据保证,N,M≤10。
60%的数据保证,N,M≤100。
100%的数据保证,N,M≤1000,1≤H≤N+1。
Bfs每次找到一个船的最边边,如果有缺口就可以让水进来,然后有空而且不超过水的高度就可以让水进去
const
fx:array[1..4,1..2]of longint=
((-1,0),(0,1),(1,0),(0,-1));
var
map:array[0..1001,0..1001]of longint;
f:array[0..1000000,1..2]of longint;
n,m,h,i,j:longint;
s:ansistring;
procedure go(x,y:longint);
var
i,j,xx,yy,k:longint;
begin
fillchar(f,sizeof(f),0);
i:=0;
j:=1;
f[1,1]:=x;
f[1,2]:=y;
while i<j do
begin
inc(i);
for k:=1 to 4 do
begin
xx:=f[i,1]+fx[k,1];
yy:=f[i,2]+fx[k,2];
if map[xx,yy]=3 then
begin
inc(j);
f[j,1]:=xx;
f[j,2]:=yy;
map[xx,yy]:=2;
end;
end;
end;
end;
begin
assign(input,'cruise.in');reset(input);
assign(output,'cruise.out');rewrite(output);
readln(n,m,h);
for i:=n downto 1 do
begin
readln(s);
for j:=1 to m do
map[i,j]:=ord(s[j])-48;
end;
for i:=1 to h do
for j:=1 to m do
if map[i,j]=0 then
map[i,j]:=3;
for i:=1 to m do
begin
if map[1,i]=3 then
begin
map[1,i]:=2;
go(1,i);
end;
if map[n,i]=3 then
begin
map[n,i]:=2;
go(n,i);
end;
end;
if h>n then
h:=n;
for i:=1 to h do
begin
if map[i,1]=3 then
begin
map[i,1]:=2;
go(i,1);
end;
if map[i,m]=3 then
begin
map[i,m]:=2;
go(i,m);
end;
end;
for i:=n downto 1 do
begin
for j:=1 to m do
if map[i,j]=3 then
write(0)
else
write(map[i,j]);
writeln;
end;
close(input);close(output);
end.