poj 3669 Meteor Shower
http://poj.org/problem?id=3669
题意:
给定几个坐标,在这些坐标上 t 时刻会有陨石雨,上下左右也被损坏。怎样在最短的时间内找到一个安全的地方。
思路:预处理每个陨石下落的周围的点,然后bfs就可以。
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <algorithm> 5 #define maxn 50000 6 using namespace std; 7 8 int n; 9 int ans,max1; 10 int vis[400][400]; 11 int dir[5][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0}}; 12 struct node 13 { 14 int x,y; 15 int t; 16 }p[maxn],st1,st2; 17 18 void bfs(int x,int y) 19 { 20 queue<node>q; 21 st1.x=x; 22 st1.y=y; 23 st1.t=0; 24 if(vis[x][y]==0) 25 { 26 return; 27 } 28 q.push(st1); 29 while(!q.empty()) 30 { 31 st2=q.front(); q.pop(); 32 if(vis[st2.x][st2.y]==-1) 33 { 34 ans=st2.t; 35 return ; 36 } 37 for(int i=0; i<5; i++) 38 { 39 int x1=st2.x+dir[i][0]; 40 int y1=st2.y+dir[i][1]; 41 if(!(x1>=0&&y1>=0)) continue; 42 if((vis[x1][y1]>st2.t+1)||(vis[x1][y1]==-1)) 43 { 44 if(vis[x1][y1]!=-1) 45 { 46 vis[x1][y1]=st2.t+1; 47 } 48 st1.x=x1;st1.y=y1; 49 st1.t=st2.t+1; 50 q.push(st1); 51 } 52 } 53 } 54 } 55 56 int main() 57 { 58 while(scanf("%d",&n)!=EOF) 59 { 60 ans=-1; 61 memset(vis,-1,sizeof(vis)); 62 for(int i=1; i<=n; i++) 63 { 64 scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].t); 65 for(int j=0; j<5; j++) 66 { 67 int xx=p[i].x+dir[j][0]; 68 int yy=p[i].y+dir[j][1]; 69 if(!(xx>=0&&yy>=0)) continue; 70 if(vis[xx][yy]==-1) 71 { 72 vis[xx][yy]=p[i].t; 73 } 74 else 75 { 76 vis[xx][yy]=min(vis[xx][yy],p[i].t); 77 } 78 } 79 } 80 bfs(0,0); 81 printf("%d\n",ans); 82 } 83 return 0; 84 }