洪水
Description
一天, 一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安
全的。
森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示,而
岩石用“X”表示,另画家的住所用“D”表示,画家用“S”表示。
有以下几点需要说明:
1、 每一分钟画家能向四个方向移动一格(上、下、左、右)
2、 每一分钟洪水能蔓延到四个方向的相邻格子(空白区域)
3、 洪水和画家都不能通过岩石区域
4、 画家不能通过洪水区域(同时也不行,即画家不能移到某个格子,该格子在画家达到的同时被洪水蔓延到了,这也是不允许的)
5、 洪水蔓不到画家的住所。
给你森林的地图,编写程序输出最少需要花费多长时间才能从开始的位置赶回家中。
Input
输入第一行包含两个整数R和C(R,C<=50)。
接下来R行每行包含C个字符(“.”、“*”、“X”、“D”或“S”)。地图保证只有一个“D”和一个“S”。
Output
输出画家最快安全到达住所所需的时间,如果画家不可能安全回家则输出“KAKTUS”。
Sample Input
输入1:
3 3
D.*
…
.S.
输入2:
3 3
D.*
…
..S
输入3:
3 6
D…*.
.X.X..
….S.
Sample Output
输出1:
3
输出2:
KAKTUS
输出3:
6
.
.
.
.
.
分析
bfs
.
.
.
.
.
.
.
const
dx:array[1..4] of longint=(1,0,-1,0);
dy:array[1..4] of longint=(0,1,0,-1);
var
a:array[0..201,-1..55,-1..55] of boolean;
b:array[-1..55,-1..55] of boolean;
h,k,r,c,x,y,ex,ey,n,i,j,n1:longint;
fx,fy:array [-1..2500] of longint;
gx,gy:array [-1..2500] of longint;
t:string;
ch:char;
f:boolean;
procedure bfs;
var
head,tail,i,nx,ny,t,s:longint;
g:array [1..125000,1..3] of longint;
flag:array [-1..55,-1..55] of boolean;
begin
fillchar(g,sizeof(g),0);
flag:=b;
tail:=1;head:=0;
g[1,1]:=x;g[1,2]:=y;g[1,3]:=1;
repeat
head:=head mod 2500+1;
for i:=1 to 4 do
begin
nx:=g[head,1]+dx[i];
ny:=g[head,2]+dy[i];
t:=g[head,3];
if t>h then exit;
if (flag[nx,ny]=true)and(a[t,nx,ny]=true)and(nx>0)and(nx<=r)and(ny>0)and(ny<=c) then
begin
tail:=tail mod 2500+1;
g[tail,1]:=nx;
g[tail,2]:=ny;
g[tail,3]:=t+1;
flag[nx,ny]:=false;
if (nx=ex)and(ny=ey) then
begin
writeln(t);
halt;
end;
end;
end;
if t>10 then inc(s);
until head=tail;
end;
procedure check;
begin
if ch='D' then
begin
ex:=i;
ey:=j;
b[i,j]:=true;
end;
if ch='S' then
begin
x:=i;
y:=j;
b[i,j]:=true;
end;
if ch='.' then b[i,j]:=true;
if ch='X' then b[i,j]:=false;
if ch='*' then
begin
inc(n);
fx[n]:=i;
fy[n]:=j;
end;
end;
begin
readln(r,c);
for i:=1 to r do
begin
for j:=1 to c do
begin
read(ch);
check;
end;
readln;
end;
h:=r shl 1+c shl 1;
a[0]:=b;
for i:=1 to h do
begin
n1:=0;
fillchar(gx,sizeof(gx),0);
fillchar(gy,sizeof(gy),0);
a[i]:=a[i-1];
f:=false;
for j:=1 to n do
begin
for k:=1 to 4 do
if (a[i,fx[j]+dx[k],fy[j]+dy[k]]=true)and(fx[j]+dx[k]>0)and(fx[j]+dx[k]<=r)and(fy[j]+dy[k]>0)and(fy[j]+dy[k]<=c)and not((fx[j]+dx[k]=ex)and(fy[j]+dy[k]=ey)) then
begin
a[i,fx[j]+dx[k],fy[j]+dy[k]]:=false;
inc(n1);
gx[n1]:=fx[j]+dx[k];
gy[n1]:=fy[j]+dy[k];
end;
end;
n:=n1;
fx:=gx;
fy:=gy;
end;
bfs;
writeln('KAKTUS');
end.