POJ-3669 Meteor Shower(bfs)

http://poj.org/problem?id=3669node

注意理解題意:有m顆行星將會落在方格中(第一象限),第i顆行星在ti時間會摧毀(xi,yi)這個點和四周相鄰的點,一我的開始在原點,而後只能在第一象限內行走,每單位時間移動一格,只能移動到當前未摧毀的點,問多少時間能到達安全地方。ios

開始題意理解錯了,沒有明白每一顆行星最多摧毀5個點,咱們能夠預處理出被行星摧毀的點,而後用bfs搜索。安全

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <vector>
 5 #include <cstring>
 6 #include <string>
 7 #include <algorithm>
 8 #include <string>
 9 #include <set>
10 #include <functional>
11 #include <numeric>
12 #include <sstream>
13 #include <stack>
14 //#include <map>
15 #include <queue>
16 
17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
18 
19 #define ll long long
20 #define inf 0x7f7f7f7f
21 #define lc l,m,rt<<1
22 #define rc m + 1,r,rt<<1|1
23 #define pi acos(-1.0)
24 
25 #define L(x)    (x) << 1
26 #define R(x)    (x) << 1 | 1
27 #define MID(l, r)   (l + r) >> 1
28 #define Min(x, y)   (x) < (y) ? (x) : (y)
29 #define Max(x, y)   (x) < (y) ? (y) : (x)
30 #define E(x)        (1 << (x))
31 #define iabs(x)     (x) < 0 ? -(x) : (x)
32 #define OUT(x)  printf("%I64d\n", x)
33 #define lowbit(x)   (x)&(-x)
34 #define Read()  freopen("a.txt", "r", stdin)
35 #define Write() freopen("dout.txt", "w", stdout);
36 #define maxn 1000000000
37 #define N 1010
38 using namespace std;
39 
40 int dir[5][2]={-1,0,1,0,0,1,0,-1,0,0};
41 int vis[500][500];
42 struct node
43 {
44     int x,y,time;
45 };
46 
47 int bfs()
48 {
49     if(vis[0][0]==-1) return 0;
50     node p;
51     p.x=p.y=p.time=0;
52     queue<node>que;
53     que.push(p);
54     while(que.size())
55     {
56         node q=que.front();
57         que.pop();
58         for(int i=0;i<4;i++)
59         {
60             p=q;
61             p.x=q.x+dir[i][0];
62             p.y=q.y+dir[i][1];
63             p.time++;
64             if(p.x<0||p.y<0) continue; //出界了
65             if(vis[p.x][p.y]==-1) return p.time;  //到達安全地方
66             if(p.time<vis[p.x][p.y])  //當前這個點還未摧毀
67             {
68                 vis[p.x][p.y]=p.time;  //必須賦值,否則會超時,這樣能夠防止往回走的狀況,節省沒必要要的搜索
69                 que.push(p);
70             }
71         }
72     }
73     return -1;
74 }
75 int main()
76 {
77     //freopen("a.txt","r",stdin);
78     int m,x,y,t;
79     scanf("%d",&m);
80     memset(vis,-1,sizeof(vis));
81     while(m--)
82     {
83         scanf("%d%d%d",&x,&y,&t);
84         for(int i=0;i<5;i++)
85         {
86             int xx=x+dir[i][0];
87             int yy=y+dir[i][1];
88             if(xx>=0&&yy>=0)  //預處理全部被摧毀的點,並賦值爲被摧毀的最小時間。
89             {
90                 if(vis[xx][yy]==-1) vis[xx][yy]=t;
91                 else vis[xx][yy]=min(t,vis[xx][yy]);
92             }
93         }
94     }
95     if(vis[0][0]==0) printf("-1\n");
96     else printf("%d\n",bfs());
97    return 0;
98 }
View Code
相關文章
相關標籤/搜索