题目描述:
考古队员发现,牛市之所以会有那么多古老遗迹,是因为牛市曾经遭遇过一场几乎毁灭了他的流星雨,那场流星雨
中流星体积很大,无法在撞击到地面前燃烧完,所以对牛市几乎造成了毁灭性的打击,但是,我们牛市的先民也是
很厉害的,他们对于流星雨的预报虽然没有提前太多的时间但是详细到了每颗流星坠落的位置,所以虽然牛市在那
一场流星雨之后满目疮痍,但是牛市的百姓大多都存活了下来。因为自然环境受到了巨大的破坏,他们记录下了这
段历史搬到其他的地方繁衍生息,很多代人之后,牛市的自然环境有了恢复,他们后代中的一些人又搬了回来,逐
渐建成了现在的牛市。这段历史被遗忘被尘封多年,但终于还是没有被遗忘……
根据遗迹中某个记载,当时先民们预报了一共有M颗流星(1 ≤ M ≤ 50, 000) 会坠落,他们将牛市划分成网
格,他们预报其中第i颗流星会在时刻 Ti(0 ≤ Ti ≤ 1, 000)砸在坐标为(Xi, Yi)(0 <= Xi <= 300, 0 <= Yi <= 300)的格子里。流星的力量会将它所在的格子,以及周围4个相邻的格子都化为焦土,在整个流星雨结束之前,这些格子都将无法行走站立。
现在有一个家族,在0时刻在0行0列的格子里,因为道路和建筑的原因,他们只能平行于坐标轴行动,每1个时刻,他们能移动到相邻的4个格子中的任意一个,当然这个格子要没有被撞击烧焦才行。(也就是说如果一个格子在时刻t被流星撞击或烧焦,那么他们只能在t之前的时刻在这个格子里出现。)
请你计算,这个家族是否在这场流星雨中幸存(移动到了一个没有被撞击或者烧焦的格子里一直待到流星雨结束),如果幸存,他们最少要花多少时间才移动到安全的格子里。
注:虽然流星只是砸在x,y坐标300的范围内,但是我们可以认为牛市在整个第一象限之内,即移动过程中x和y都
可以超出300(但不能为负)。
解题思路:
bfs,用一个mp来记录流星什么时候落下,mp初始时都是0x7f,每次读入都将其下落点和相邻四个格子进行更新。这里要注意,mp所记录的值是有后效性的!(这已经是第二次被后效性坑了)mp进一步理解是记录这个格子什么时候开始就不能走了。避开这个坑就好说了,bfs搜索到安全地点时输出就完了。
代码

#include<bits/stdc++.h>
using namespace std;
int m;
int mp[500][500];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int vis[500][500];
struct node{
    int x, y, t;
};
queue<node> q;
int bfs()
{
    q.push({0,0,0});
    vis[0][0]=1;
    while(!q.empty()) {
        node tmp = q.front();
        q.pop();
        for(int i = 0; i < 4; i++) {
            int dx = tmp.x+dir[i][0];
            int dy = tmp.y+dir[i][1];
            int dt = tmp.t+1;
            if(vis[dx][dy]) continue;
            if(dt >= mp[dx][dy]) continue;
            if(dx < 0 || dy < 0) continue;
            vis[dx][dy] = 1;
            if(mp[dx][dy]  > 1000)  return dt;
            q.push({dx, dy, dt});
        }
    }
    return -1;
}
int main()
{
    scanf("%d",&m);
    memset(mp, 0x7f, sizeof(mp));
    memset(vis, 0, sizeof(vis));
    for(int i = 0; i < m; i++) {
        int bx, by, bt;
        scanf("%d%d%d",&bx,&by,&bt);
        mp[bx][by] = min(bt,mp[bx][by]);
        for(int k = 0; k < 4; k++) {
            int dx = bx+dir[k][0];
            int dy = by+dir[k][1];
            if(dx >= 0 && dy >= 0)
                mp[dx][dy] = min(bt, mp[dx][dy]);
        }
    }
    int ans = bfs();
    printf("%d\n",ans);
}