[TIOJ] 1013

Fire in the forest

題敘

Link
有一個$10\times17$的地圖,
其中有一個點著火了,已經過了$T$時間,
問還能不能到達目的地,如果可以輸出距離

提示

怎樣的點是可以走的到的?

想法

做兩次BFS,
第一次把著火時間表建出來,
第二次開始走,如果我走到之前先著火就不能走。

細節

可能會想作法明明很簡單啊…但我還是WA了20幾次OAO
原因是:

  • 火是會跟人一樣受地圖限制的,如果你少判這個可會全錯。
  • 不能透過終點蔓延,如果你少判這個Test 3, 4會錯。
  • 起點可能早已著火,如果你少判這個Test 3可能會錯。
  • 只輸出Help! 會對Test 2, 4。
    $_{果然我還是太弱了OAO}$

後記

不敢再不刷水題了…
另外現在我正在想辦法改良我題解的方式,如果有建議可以告訴我owob

AC Code

(Code殘破不堪,可能無助於Debug OAQ)

/*  | |       _    _  | |        _____       | |
//  | |   _  | |  | | | | _____ /  ___|__  __| |___  _____
//  | |  |_|[   ][   ]| |/  _  \| |    | | | |  _  \/  _  \  
//  | L__| | | |_ | |_| || ____|| |___ | |_| | |_| || ____|
//  L____|_| |___||___|_|\_____|\_____|\_____/\____/\_____|
//  Segment Tree is hard.
*/
#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
//#pragma pack(0)
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define F first
#define S second
#define pb(x) emplace_back(x)
#define MOD 1000000007
#define MOD2 998244353
#define _INFINITY 9223372036854775807
#define fast ios::sync_with_stdio(0), cin.tie(0)
using namespace std;

string g[10] = {"*****************",
                "*...*.......**..*",
                "**..*....*.*.*..*",
                "*......*.**.**.**",
                "*..**...**..**.**",
                "**.....**..*.*..*",
                "*....*..........*",
                "*.....****.*...**",
                "****.*.*........*",
                "*****************"};
int n, m, t, fx, fy, sx, sy, ex, ey, graph[10][17];
int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0};
queue<pii> q;
signed main()
{
    fast;
    cin >> fx >> fy;
    graph[fx][fy] = -1;
    q.push(make_pair(fx, fy));
    cin >> t;
    cin >> sx >> sy >> ex >> ey;
    g[ex][ey] = '*';

    while (!q.empty())
    {
        //cout << q.front().F << " " << q.front().S << " " << graph[q.front().F][q.front().S] << '\n';
        for (int i = 0; i < 4; i++)
            if (g[q.front().F + dx[i]][q.front().S + dy[i]] == '.' &&
                graph[q.front().F + dx[i]][q.front().S + dy[i]] == 0)
            {
                graph[q.front().F + dx[i]][q.front().S + dy[i]] = graph[q.front().F][q.front().S] - 1;
                q.push(make_pair(q.front().F + dx[i], q.front().S + dy[i]));
            }
        q.pop();
    }
    while (!q.empty())
        q.pop();

    if (-graph[sx][sy] >= t)
        q.push(make_pair(sx, sy));
    graph[sx][sy] = t;
    graph[ex][ey] = -10000000000;
    g[ex][ey] = '.';

    while (!q.empty())
    {
        if (q.front() == make_pair(ex, ey))
        {
            cout << graph[ex][ey] - t << '\n';
            return 0;
        }
        for (int i = 0; i < 4; i++)
            if (g[q.front().F + dx[i]][q.front().S + dy[i]] == '.' && 
                ((graph[q.front().F][q.front().S] + 1 < abs(graph[q.front().F + dx[i]][q.front().S + dy[i]])) ||
                  graph[q.front().F + dx[i]][q.front().S + dy[i]] == 0))
            {
                graph[q.front().F + dx[i]][q.front().S + dy[i]] = graph[q.front().F][q.front().S] + 1;
                q.push(make_pair(q.front().F + dx[i], q.front().S + dy[i]));
            }
        q.pop();
    }
    cout << "Help!\n";
}