知识点:广搜
这个题也是个裸的广搜,就是障碍稍微有点不太一样,障碍就是流行下落的时间,如果你能早于流星下落,那么就可以到达某个点,否则那个点就是障碍物,是不能走的
然后这道题有一些坑点,每个点要以最小的不能走的时间为准,坐标不能小于0但是可以大于300,无解输出-1,
#include <bits/stdc++.h>
using namespace std;
const int N = 305;
struct state {
int x, y;
state() {}
state(int a, int b): x(a), y(b) {}
};
int a[N][N];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
void bfs() {
int dist[N][N];
memset(dist, -1, sizeof(dist));
dist[0][0] = 0;
queue<state> q;
if (a[0][0]) q.push(state(0, 0));
while (!q.empty()) {
state now = q.front(); q.pop();
if (a[now.x][now.y] == 1005) { cout << dist[now.x][now.y]; return; }
for (int i = 0; i < 4; i++) {
int x1 = now.x + dx[i];
int y1 = now.y + dy[i];
if (x1 < 0 || y1 < 0) continue;
if (dist[x1][y1] != -1 || a[x1][y1] <= dist[now.x][now.y] + 1) continue;
q.push(state(x1, y1));
dist[x1][y1] = dist[now.x][now.y] + 1;
}
}
cout << -1;
}
int main() {
fill((int*) a, (int*) a + N * N, 1005);
int m;
cin >> m;
for (int i = 0; i < m; i++) {
int x, y, t;
cin >> x >> y >> t;
a[x][y] = min(a[x][y], t);
for (int j = 0; j < 4; j++) {
int x1 = x + dx[j];
int y1 = y + dy[j];
if (x1 < 0 || y1 < 0) continue;
a[x1][y1] = min(a[x1][y1], t);
}
}
bfs();
return 0;
}