洪水

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.

posted @ 2018-04-11 16:04  银叶草  阅读(245)  评论(0编辑  收藏  举报
Live2D