zoukankan      html  css  js  c++  java
  • Fire! UVA

    链接


    直接BFS搜索即可
    需要注意的是每一轮要先搜索火然后再搜索人走的位置

    #include <bits/stdc++.h>
    using namespace std;
    
    constexpr int N = 0x3f3f3f3f;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        // freopen("in.dat", "r", stdin);
        int t;
        cin >> t;
        while (t--)
        {
            int n, m;
            cin >> n >> m;
            vector<string> maze(n);
            for (int i = 0; i < n; i++)
                cin >> maze[i];
            // unordered_set<int> used;
            auto get = [](int x, int y) {
                return x * 10000 + y;
            };
            auto valid = [&](int x, int y) {
                return x <= 0 || x > n || y <= 0 || y > m || (maze[x - 1][y - 1] != '#' && maze[x - 1][y-1]!= 'F'&&maze[x-1][y-1]!='J'); //在这里面但是没有超出去
            };
            auto out = [&](int x, int y) {
                return x <= 0 || x > n || y <= 0 || y > m;
            };
            queue<pair<int, int>> que;
            int ans = 0x3f3f3f3f;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    if (maze[i][j] == 'F')
                        que.push({get(i + 1, j + 1), -100000000}); //火表示的是负数
                }
            }
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    if (maze[i][j] == 'J')
                        que.push({get(i + 1, j + 1), 0});
                }
            }
            //保证先搜了火
            int x, y;
            int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
            while (!que.empty())
            {
                auto e = que.front();
                que.pop();
                if (e.second >= 0 && out(e.first / 10000, e.first % 10000))
                {
                    ans = e.second;
                    break;
                }
                if (out(e.first / 10000, e.first % 10000))
                    continue;
                for (int i = 0; i < 4; i++)
                {
                    x = e.first / 10000 + dir[i][0];
                    y = e.first % 10000 + dir[i][1];
                    if (valid(x, y)){
                        que.push({get(x, y), e.second + 1});
                        if (!out(x, y))
                            maze[x - 1][y - 1] = maze[e.first / 10000-1][e.first % 10000-1];
                    }
                    
                }
            }
            if (ans == N)
                cout << "IMPOSSIBLE" << endl;
            else
                cout << ans << endl;
        }
    }
    
  • 相关阅读:
    自然二进制与格雷码的转换
    状态机小结
    FSM的几种策略
    跨越鸿沟:同步世界中的异步信号
    边沿检测技术
    门控时钟和时钟使能
    ALTERA器件中复位电路实现之-异步复位同步化
    同步复位
    Altera USB Blaster 仿真器(EPM240仿制版
    五、裸机烧写
  • 原文地址:https://www.cnblogs.com/Crossea/p/13969470.html
Copyright © 2011-2022 走看看