[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";
}