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;
    }
  • 相关阅读:
    jQuery中排除指定元素,同时选择剩下的所有元素
    Silverlight Telerik控件学习:弹出窗口RadWindow
    biztalk 2010 dev版安装小记
    Flex4中的ModuleLoader,Alert以及TitleWindow
    Silverlight Telerik控件学习:主题Theme切换
    用Flex模拟智能手机表单输入的自动放大功能
    "为帮助内容存储区指定的位置无效或者您无权访问该位置"解决方法
    Flex4中使用WCF
    Silverlight单元测试
    Silverlight:纠结的快捷键问题
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7561515.html
Copyright © 2011-2022 走看看