[USACO08FEB] Meteor Shower S - 洛谷
这个题也是暴搜
将流星的时间填入地图,比对人能到达的时间即可
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int, int> PII;
const int N = 1000;
int g[N][N];
int n;
queue<PII> q;
bool return0 = false;
void bfs()
{
q.push({0, 0});
g[0][0] = 0;
int dx[] = {0, 0, -1, 1}, dy[] = {-1, 1, 0, 0};
while(q.size())
{
auto t = q.front();
q.pop();
for(int i = 0; i < 4; i ++ )
{
int a = t.first + dx[i], b = t.second + dy[i];
if(a < 0 || b < 0) continue;
if(g[a][b] == -1)
{
cout << g[t.first][t.second] + 1 << endl;
return0 = true;
return;
}
else if(g[t.first][t.second] + 1 < g[a][b])
{
q.push({a, b});
g[a][b] = g[t.first][t.second] + 1;
}
}
}
}
int main(){
cin >> n;
for(int i = 0; i < 1000; i ++ )
{
memset(g[i], -1, sizeof g[i]);
}
for(int i = 0; i < n; i ++ )
{
int a, b, t;
cin >> a >> b >> t;
if(g[a][b] == -1) g[a][b] = t;
else if(t < g[a][b]) g[a][b] = t;
if(g[a - 1][b] == -1) g[a - 1][b] = t;
else if(t < g[a - 1][b]) g[a - 1][b] = t;
if(g[a + 1][b] == -1) g[a + 1][b] = t;
else if(t < g[a + 1][b]) g[a + 1][b] = t;
if(g[a][b - 1] == -1) g[a][b - 1] = t;
else if(t < g[a][b - 1]) g[a][b - 1] = t;
if(g[a][b + 1] == -1) g[a][b + 1] = t;
else if(t < g[a][b + 1]) g[a][b + 1] = t;
}
bfs();
if(return0) return 0;
printf("-1");
return 0;
}