题意描述与解析:
有个小文青去看流星雨,不料流星掉下来会砸毁上下左右中五个点。每个流星掉下的位置和时间都不同,求小文青能否活命,如果能活命,最短的逃跑时间是多少?
思路:对流星雨排序,然后将地图的每个点的值设为该点最早被炸毁的时间。如果起点一开始就被炸毁了的话,那小文青就直接挂花,否则bfs。
参考程序:
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<queue> struct Meteor{ int x,y,t; }; typedef Meteor P; bool visited[512][512]; int map[512][512],x[51002],y[51002],t[51002]; int N,last; const int direction[5][2]={ {1,0}, {-1,0}, {0,1}, {0,-1}, {0,0}, }; using namespace std; int bfs(){ memset(visited,0,sizeof(visited)); queue<P> que; P current; current.x=0; current.y=0; current.t=0; que.push(current); while (que.size()){ const P p=que.front(); que.pop(); for (int j=0;j<4;j++){ current=p; current.x+=direction[j][0]; current.y+=direction[j][1]; current.t++; if (current.x >= 0 && current.y >= 0 && map[current.x][current.y] > current.t && !visited[current.x][current.y]){ visited[current.x][current.y]=true; if (map[current.x][current.y]>last){ return current.t; } que.push(current); } } } return -1; } int main(){ scanf("%d",&N); for (int i=0;i<N;i++) scanf("%d%d%d",&x[i],&y[i],&t[i]); memset(map,0x7F,sizeof(map)); for (int i=0;i<N;i++){ last=max(last,t[i]); for (int j=0;j<5;j++){ int nx=x[i]+direction[j][0]; int ny=y[i]+direction[j][1]; if (nx>=0 && ny>=0) map[nx][ny]=min(t[i],map[nx][ny]); } } if (map[0][0]==0) printf("-1\n"); else printf("%d\n",bfs()); return 0; }
时间: 2024-10-12 11:51:49