zoukankan      html  css  js  c++  java
  • Kattis

    这里写图片描述

    这里写图片描述

    第二组样例:
    这里写图片描述

    题意
    给出一个起始位置,然后要跑到这幢建筑物的外面,上下左右四个方向,只要是空地 就可以走 走一步 花费一秒 然后有若干串火苗,每一秒钟 会向上下左右 四个方向的空地 蔓延 但是 逃跑的优先级在先
    比如
    这里写图片描述

    这个例子 @会先逃到右边,火苗再蔓延

    思路
    用BFS 记录能到的下一步的位置,然后记录火苗的本次蔓延位置,用双队列,然后先遍历下一步的位置 再遍历火苗蔓延的位置 最后 设置出口条件就可以了
    两个出口
    ① 当没有下一步的位置 并且当前步没有一步是在边界 就是no
    ② 当前步在边界 直接更新答案 输出

    AC代码

    #include <cstdio>
    #include <cstring>
    #include <ctype.h>
    #include <cstdlib>
    #include <cmath>
    #include <climits>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <deque>
    #include <vector>
    #include <queue>
    #include <string>
    #include <map>
    #include <stack>
    #include <set>
    #include <numeric>
    #include <sstream>
    #include <iomanip>
    #include <limits>
    
    using namespace std;
    typedef long long ll;
    typedef long double ld;
    typedef unsigned long long ull;
    typedef pair <int, int> pii;
    typedef pair <ll, ll> pll;
    
    const double PI  = 3.14159265358979323846264338327;
    const double E   = exp(1);
    const double eps = 1e-6;
    
    const int INF  = 0x3f3f3f3f;
    const int maxn = 1e3 + 5;
    const int MOD  = 1e9 + 7;
    
    string Map[maxn];
    
    int n, m;
    int ans;
    
    queue <pii> q, f;
    
    int Move[4][2] =
    {
        -1, 0, //up
        1, 0, //down
        0,-1, //left
        0, 1, //right
    };
    
    bool out_range(int x, int y)
    {
        if (x == 0 || y == 0 || x == (m - 1) || y == (n - 1))
            return true;
        return false;
    }
    
    bool in_range(int x, int y)
    {
        if (x >= 0 && x < m && y >= 0 && y < n)
            return true;
        return false;
    }
    
    void fire(int x, int y)
    {
        int next_x, next_y;
        for (int i = 0; i < 4; i++)
        {
            next_x = x + Move[i][0];
            next_y = y + Move[i][1];
            if (in_range(next_x, next_y))
            {
                if (Map[next_x][next_y] == '.' || Map[next_x][next_y] == '$')
                {
                    Map[next_x][next_y] = '*';
                    f.push(pii(next_x, next_y));
                }
            }
        }
    }
    
    void dfs(int cur)
    {
        int x, y;
        int next_x, next_y;
        int len = q.size();
        while (len--)
        {
            x = q.front().first;
            y = q.front().second;
            q.pop();
            if (Map[x][y] == '*')
                continue;
            if (out_range(x, y))
            {
                ans = cur;
                return;
            }
            for (int i = 0; i < 4; i++)
            {
                next_x = x + Move[i][0];
                next_y = y + Move[i][1];
                if (in_range(next_x, next_y) && Map[next_x][next_y] == '.')
                {
                    Map[next_x][next_y] = '$';
                    q.push(pii(next_x, next_y));    
                }
            }
        }
        if (q.size() == 0)
            return;
        else
        {
            int len = f.size();
            int x, y;
            while (len--)
            {
                x = f.front().first;
                y = f.front().second;
                fire(x, y);
                f.pop();            
            }
            dfs(cur + 1);
        }
    }
    
    int main()
    {
        int t;
        cin >> t;
        while (t--)
        {
            while (!q.empty())
                q.pop();
            while (!f.empty())
                f.pop();
            scanf("%d%d", &n, &m);
            for (int i = 0; i < m; i++)
            {
                cin >> Map[i];
                for (int j = 0; j < n; j++)
                {
                    if (Map[i][j] == '@')
                    {
                        Map[i][j] = '$';
                        q.push(pii(i, j));
                    }
                    else if (Map[i][j] == '*')
                        f.push(pii(i, j));
                }
            }
            ans = -1;
            dfs(1);
            if (ans == -1)
                printf("IMPOSSIBLE
    ");
            else
                printf("%d
    ", ans);
        }
    }
  • 相关阅读:
    SP1716 GSS3
    A Simple Problem with Integers题解
    P4528 [CTSC2008]图腾 题解
    P1498 南蛮图腾 题解
    P2024 [NOI2001]食物链 题解
    Windows编程 Windows程序的生与死(中)
    Windows编程 Windows程序的生与死(上)
    C#实现在注册表中保存信息
    沿路径动画(Animation Along a Path)
    倾斜动画(SkewTransform)
  • 原文地址:https://www.cnblogs.com/Dup4/p/9433237.html
Copyright © 2011-2022 走看看