**思路:依旧BFS+队列** 用map_time[] 维护陨石掉落时间0
vis[]标记是否走过
***当枚举四联通之后,如果map_time的值还是-1,说明该点不是陨石能影响到的地方***
#include <bits/stdc++.h>
using namespace std;
struct node{
int x,y,time;
};
int m,x,y,t;
int map_time[350][350];
bool vis[350][350];
int Y[4]={1,-1,0,0};
int X[4]={0,0,1,-1};
int main()
{
cin>>m;
fill(map_time[0],map_time[0]+305*305,-1);
memset(vis,0,sizeof(vis));
for(int i=0;i<m;i++){
cin>>x>>y>>t;
if(map_time[x][y]==-1||t<map_time[x][y])
map_time[x][y] = t;
for(int j=0;j<4;j++){
int xx = x+X[j];
int yy = y+Y[j];
if(xx>=0&&yy>=0&&(map_time[xx][yy]==-1||t<map_time[xx][yy]))
map_time[xx][yy] = t;
}
}
node p;
queue<node> Q;
p.x=0;p.y=0;p.time=0;vis[0][0]=true;
Q.push(p);
while(!Q.empty())
{
p = Q.front();
Q.pop();
for(int i=0;i<4;i++)
{
int xx = p.x+X[i];
int yy = p.y+Y[i];
if(xx>=0&&yy>=0&&vis[xx][yy]==false&&(map_time[xx][yy]==-1||p.time+1<map_time[xx][yy]))
{
node txt;
txt.x = xx;
txt.y = yy;
txt.time = p.time + 1;
vis[xx][yy] = true;
Q.push(txt);
if(map_time[xx][yy]==-1) //安全点
{
cout<<txt.time<<endl;
return 0;
}
}
}
}
cout<<"-1"<<endl;
return 0;
}