• 洪水


    题目

    一天, 一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安全的。

    森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示,而
    岩石用“X”表示,另画家的住所用“D”表示,画家用“S”表示。
    有以下几点需要说明:
    1、 每一分钟画家能向四个方向移动一格(上、下、左、右)
    2、 每一分钟洪水能蔓延到四个方向的相邻格子(空白区域)
    3、 洪水和画家都不能通过岩石区域
    4、 画家不能通过洪水区域(同时也不行,即画家不能移到某个格子,该格子在画家达到的同时被洪水蔓延到了,这也是不允许的)
    5、 洪水蔓不到画家的住所。
    给你森林的地图,编写程序输出最少需要花费多长时间才能从开始的位置赶回家中。

      输入1:
    3 3 
    D.* 
    ... 
    .S. 
    输入2:
    3 3 
    D.* 
    ...
    ..S
    输入3:
    3 6 
    D...*. 
    .X.X.. 
    ....S. 
    输出1:
    3
    
    输出2:
    KAKTUS 
    
    输出3:
    6


















    BFS

    预处理处洪水到达每一个点的最小时间, 再跑一遍BFS,求出到达D点的最小时间,过程中如果S到达这个点的时间大于或等于洪水到达的时间,那么S就不能走这一个点

     
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    int n,m,c[105][105],ans=2147483647,bn[1005],cn[1005],bx[10000],by[10000],btime[10000];
    bool v[100][100];
    char a[100][100];
    int dx[5]={0,1,-1,0,0};
    int dy[5]={0,0,0,-1,1};
    int main()
    {
        scanf("%d%d",&n,&m);
        int x1,y1,cnt;
        for (int i=0;i<=102;i++)
            for (int j=1;j<=102;j++)
            c[i][j]=2147483647;
        memset(v,false,sizeof(v));
        for (int i=1;i<=n;i++)
        {
            scanf("%s",a[i]+1);
            for (int j=1;j<=m;j++)
            {
                if (a[i][j]=='S') x1=i,y1=j;
                if (a[i][j]=='*') bn[++cnt]=i,cn[cnt]=j;
            }
        }
        for (int i=1;i<=cnt;i++)//处理出洪水到达每个点的时间
        {
            memset(v,false,sizeof(v));
            int h=0,t=1,x=bn[i],y=cn[i];
            c[x][y]=0;
            while (h<t)
            {
                h++;
                c[x][y]=min(c[x][y],btime[h-1]);
                for (int l=1;l<=4;l++)
                {
                    if (x+dx[l]<1||x+dx[l]>n||y+dy[l]<1||y+dy[l]>m) continue;
                    if (v[x+dx[l]][y+dy[l]]==true) continue;
                    if (a[x+dx[l]][y+dy[l]]=='.')
                    {
                        bx[t]=x+dx[l];
                        by[t]=y+dy[l];
                        v[bx[t]][by[t]]=true;
                        btime[t]=btime[h-1]+1;
                        t++;
                    }
                }
                x=bx[h],y=by[h];
            }
        }
        memset(v,false,sizeof(v));
        memset(bx,0,sizeof(bx));
        memset(by,0,sizeof(by));
        memset(btime,0,sizeof(btime));
        int h=0,t=1,x=x1,y=y1;
        while (h<t)
        {
            h++;
            for (int l=1;l<=4;l++)
            {    
                if (x+dx[l]<1||x+dx[l]>n||y+dy[l]<1||y+dy[l]>m) continue;
                if (v[x+dx[l]][y+dy[l]]==true) continue;
                if (btime[h-1]+1>=c[x+dx[l]][y+dy[l]]) continue;
                if (a[x+dx[l]][y+dy[l]]=='.'||a[x+dx[l]][y+dy[l]]=='D')
                {
                    bx[t]=x+dx[l];
                    by[t]=y+dy[l];
                    v[bx[t]][by[t]]=true;
                    btime[t]=btime[h-1]+1;
                    if (a[bx[t]][by[t]]=='D')
                    {
                        printf("%d
    ",btime[t]);
                        return 0;
                    }
                    t++;
                }
            }
            x=bx[h],y=by[h];
        }
         printf("KAKTUS
    ");
    }
    
    
    
  • 相关阅读:
    Deployment progressDeadlineSeconds
    go字符串转[]bytes
    shell单引号内嵌套单引号即可使用变量
    ensp 模拟 calico 跨网段 bgp 网络
    如何利用termination GracePeriodSeconds 优雅地关闭你的服务
    gin是怎么传参数
    垃圾代码评析——关于《C程序设计伴侣》9.4——链表(三)
    垃圾“程序是怎样练成的”——关于《C程序设计伴侣》第A章(五)
    垃圾代码评析——关于《C程序设计伴侣》9.4——链表(四)
    垃圾“程序是怎样炼成的”——关于《C程序设计伴侣》第A章(二)
  • 原文地址:https://www.cnblogs.com/nibabadeboke/p/11334221.html
Copyright © 2020-2023  润新知