zoukankan      html  css  js  c++  java
  • 水灾

    大雨应经下了几天雨,却还是没有停的样子。土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没。

    CCY所在的城市可以用一个N*M(N,M<=50)的地图表示,地图上有五种符号:“. * X D S”。其中“X”表示石头,水和人都不能从上面经过。“.”表示平原,CCY和洪水都可以经过。“*”表示洪水开始地方(可能有多个地方开始发生洪水)。“D”表示CCY的别墅。“S”表示CCY现在的位置。

    CCY每分钟可以向相邻位置移动,而洪水将会在CCY移动之后把相邻的没有的土地淹没(从已淹没的土地)。

    求CCY回到别墅的最少时间。如果聪哥回不了家,就很可能会被淹死,那么他就要膜拜黄金大神涨RP来呼叫直升飞机,所以输出“ORZ hzwer!!!”。

    输入文件 sliker.in

    输出文件 sliker.out

    Input

    3 3

    D.*

    .S.

    Output

    3

    Input

    3 3

    D.*

    ..S

    Output

    ORZ hzwer!!!

    Input

    3 6

    D…*.

    .X.X..

    ….S.

    Output

    6

     思路:

      暴力bfs强行ac

    来,上代码:

    #include<map>
    #include<queue>
    #include<cstdio>
    
    using namespace std;
    
    const int dx[5]={0,-1,0,1,0};
    const int dy[5]={0,0,1,0,-1};
    
    struct node {
        int x,y,now;
    };
    struct node cur_1,cur_2,cur_3;
    
    int n,m,imap[51][51],sx,sy,ex,ey,ans;
    
    char cmap[51][51];
    
    bool pd[51][51],if_all;
    
    queue<struct node>que;
    
    void make_water()
    {
        int now_1=2;
        while(now_1<200)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    if(imap[i][j]>0&&imap[i][j]<now_1)
                    {
                        for(int v=1;v<=4;v++)
                        {
                            if(i+dx[v]<=n&&i+dx[v]>0&&j+dy[v]<=m&&j+dy[v]>0)
                            {
                                if(imap[i+dx[v]][j+dy[v]]==0)
                                {
                                    imap[i+dx[v]][j+dy[v]]=now_1;
                                }
                            }
                        }
                    }
                }
            }
            now_1++;
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++) if(imap[i][j]==0) imap[i][j]=3000;
        }
    }
    
    void bfs()
    {
        cur_1.x=sx,cur_1.y=sy,cur_1.now=1;
        pd[sx][sy]=true;
        que.push(cur_1);
        while(!que.empty())
        {
            cur_1=que.front();
            que.pop();
            //printf("%d %d %d
    ",cur_1.x,cur_1.y,cur_1.now);
            for(int i=1;i<=4;i++)
            {
                if(cur_1.x+dx[i]>0&&cur_1.y+dy[i]>0&&cur_1.x+dx[i]<=n&&cur_1.y+dy[i]<=m)
                {
                    if(ex==cur_1.x+dx[i]&&ey==cur_1.y+dy[i]&&cur_1.now<imap[cur_1.x][cur_1.y])
                    {
                        ans=cur_1.now;
                        if_all=true;
                    }
                    if(if_all) break;
                    if(imap[cur_1.x+dx[i]][cur_1.y+dy[i]]>cur_1.now&&!pd[cur_1.x+dx[i]][cur_1.y+dy[i]])
                    {
                        pd[cur_1.x+dx[i]][cur_1.y+dy[i]]=true;
                        cur_2.x=cur_1.x+dx[i];
                        cur_2.y=cur_1.y+dy[i];
                        cur_2.now=cur_1.now+1;
                        que.push(cur_2);
                    }
                }
            }
            if(if_all) break;
        }
        if(if_all) printf("%d
    ",ans);
        else printf("ORZ hzwer!!!
    ");
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%s",cmap[i]+1);
            for(int j=1;j<=m;j++)
            {
                if(cmap[i][j]=='D') ex=i,ey=j,imap[i][j]=-2;
                if(cmap[i][j]=='S') sx=i,sy=j;
                if(cmap[i][j]=='X') imap[i][j]=-1;
                if(cmap[i][j]=='*') imap[i][j]=1;
            }
        }
        make_water();
        bfs();
        return 0;
    }
  • 相关阅读:
    BZOJ 2152 聪聪可可
    hdu 1028 && hdu 1398 && hdu 1085 && hdu 1171 ——生成函数
    bzoj 4827 [Hnoi2017]礼物——FFT
    bzoj 4503 两个串——FFT
    bzoj 3527 [Zjoi2014]力——FFT
    bzoj 3160 万径人踪灭——FFT
    bzoj 2194 快速傅立叶之二
    bzoj 2179 FFT快速傅立叶
    洛谷 3803 【模板】多项式乘法(FFT)
    CF 622F The Sum of the k-th Powers——拉格朗日插值
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6073439.html
Copyright © 2011-2022 走看看