zoukankan      html  css  js  c++  java
  • noip模拟赛 水灾

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

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

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

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

    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,记录洪水到每个点的时间,然后从出发点看到每个点的时间是不是小于洪水到达的时间,但是要看清楚题目的意思,可能会有多个洪水点,这样的话就要放进一个数组里处理,判断能不能走的时候要结合多种情况考虑,做好了这些就可以了.

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    const int maxn = 60,inf = 0x7ffffff;
    int a[maxn][maxn], n, m, sx, sy, tx, ty, t[maxn][maxn], vis[maxn][maxn],d[maxn][maxn];
    int ddx[4] = { 0, 1, -1, 0 }, ddy[4] = { 1, 0, 0, -1 },tot;
    char s[maxn];
    bool flag;
    
    struct node
    {
        int x, y;
    }e[maxn * maxn];
    
    void bfs1()
    {
        queue <node> q;
        for (int i = 1; i <= tot; i++)
        {
            node temp;
            temp.x = e[i].x;
            temp.y = e[i].y;
            q.push(temp);
            vis[temp.x][temp.y] = 1;
            t[temp.x][temp.y] = 0;
        }
        while (!q.empty())
        {
            node u = q.front();
            q.pop();
            for (int i = 0; i < 4; i++)
            {
                int nx = u.x + ddx[i], ny = u.y + ddy[i];
                if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && !vis[nx][ny] && a[nx][ny] == 1)
                {
                    vis[nx][ny] = 1;
                    t[nx][ny] = t[u.x][u.y] + 1;
                    node temp;
                    temp.x = nx;
                    temp.y = ny;
                    q.push(temp);
                }
            }
        }
    }
    
    void bfs2()
    {
        queue <node>q;
        node temp;
        temp.x = sx;
        temp.y = sy;
        q.push(temp);
        vis[sx][sy] = 1;
        while (!q.empty())
        {
            node u = q.front();
            q.pop();
            if (u.x == tx && u.y == ty)
            {
                flag = 1;
                return;
            }
            for (int i = 0; i < 4; i++)
            {
                int nx = u.x + ddx[i], ny = u.y + ddy[i];
                if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && !vis[nx][ny] && (a[nx][ny] || a[nx][ny] == -1) && d[u.x][u.y] + 1< t[nx][ny])
                {
                    d[nx][ny] = d[u.x][u.y] + 1;
                    vis[nx][ny] = 1;
                    node temp;
                    temp.x = nx;
                    temp.y = ny;
                    q.push(temp);
                }
            }
        }
    }
    
    int main()
    {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                t[i][j] = inf;
        for (int i = 1; i <= n; i++)
        {
            scanf("%s", s + 1);
            for (int j = 1; j <= m; j++)
            {
                if (s[j] == '.')
                    a[i][j] = 1;
                if (s[j] == 'X')
                    a[i][j] = 0;
                if (s[j] == '*')
                {
                    e[++tot].x = i;
                    e[tot].y = j;
                }
                if (s[j] == 'D')
                {
                    tx = i;
                    ty = j;
                    a[i][j] = -1; 
                }
                if (s[j] == 'S')
                {
                    sx = i;
                    sy = j;
                }
            }
        }
        bfs1();
        t[tx][ty] = inf;
        memset(vis, 0, sizeof(vis));
        bfs2();
        if (!flag)
            printf("ORZ hzwer!!!
    ");
        else
            printf("%d
    ", d[tx][ty]);
    
        return 0;
    }
  • 相关阅读:
    创建或者连接管道+++检查管道空间是否够写入本消息++++删除管道
    从instr中截取第一个delimiter之前的内容放到outstr中,返回第一个delimiter之后的位置
    把数字按网络顺序或主机顺序存放到字符串中++++把字符串按网络顺序转换成数字++++把字符串按主机顺序转换成数字
    压缩空格的函数以及BCD码与ASCII相互转换函数
    判断文件是否存在
    把指定长度字符串转换成数字
    找到特定串在源字符串中的位置
    FTP命令详解
    docker 学习路线
    云原生技术的了解
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7561515.html
Copyright © 2011-2022 走看看