POJ - 3669

POJ - 3669

BFS 预处理

女主要从\((0,0)\) 开始逃到一个没有流星砸到的地方,这题只给了流星砸落的时间没有给整个地图

地图边界按最大值计算,女主到达某个地方的时间必须要小于流星砸落的时间就能继续走。

预处理流星砸落的时间即可

#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
#define endl '\n'
const int N = 350,INF = 0x3f3f3f3f;
int g[N][N],n,dist[N][N];
int dx[4] = {0,0,1,-1},dy[4] = {1,-1,0,0},ans;
bool check(int x,int y) {
    return x >= 0 && x < N && y >= 0 && y < N;
}
struct node {
    int x,y;
};
int bfs() {
    if(g[0][0] == 0) return -1;
    queue<node> q;
    q.push({0,0});
    dist[0][0] = 0;
    while(q.size()) {
        node t = q.front();
        q.pop();
        if(g[t.x][t.y] == INF) return dist[t.x][t.y];
        for(int i = 0;i < 4; ++i) {
            int nx = t.x + dx[i],ny = t.y + dy[i];
            if(check(nx,ny) && dist[nx][ny] == INF && dist[t.x][t.y] + 1 < g[nx][ny]) {
                q.push({nx,ny});
                dist[nx][ny] = dist[t.x][t.y] + 1;
            }
        }
    }
    return -1;

}
int main() {
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int x,y,t;
    memset(g,0x3f,sizeof g);
    memset(dist,0x3f,sizeof dist);
    cin >> n;
    while(n --) {
        cin >> x >> y >> t;
        g[x][y] = min(g[x][y],t);
        for(int i = 0;i < 4; ++i) {
            int nx = x + dx[i],ny = y + dy[i];
            if(check(nx,ny)) g[nx][ny] = min(g[nx][ny],t);
        }
    }
    cout << bfs() << endl;
    return 0;
}
posted @ 2020-03-08 13:59  南风--  阅读(75)  评论(0编辑  收藏  举报