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 }
View Code

 

posted @ 2014-09-25 21:44  null1019  阅读(137)  评论(0编辑  收藏  举报