• 洪水


    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.
    
    
  • 相关阅读:
    [Flink] 从 RabbitMQ 读取并计算后输出到 MySQL
    极光笔记丨搭建UMS私有云文件服务器
    极光笔记丨Spark SQL 在极光的建设实践
    Iog4j2漏洞相关技术分析
    极光笔记丨关于数据大屏一比一还原设计稿这件事
    极光笔记|基于CMPP协议集成短信测试桩全流程实践分享
    极光笔记|数据服务平台一期建设
    【记录】GIT常用命令
    【原创】使用micrel的千兆PHY芯片ksz9021GN和KSZ9021GQ前要注意
    【记录】调试千兆以太网PHY芯片DP83865的痛苦经历
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9499949.html
Copyright © 2020-2023  润新知