ACM Meteor Shower

 

贝茜听到一场非同寻常的流星雨( meteor shower)即将来临;有报道称这些流星将撞击地球并摧毁它们所击中的任何东西。为了安全起见(Anxious for her safety), ,她发誓(vows)要找到一条路到安全的地方(一个从未被流星摧毁的地方)。目前,她在坐标轴(coordinate plane)的原点上,想要移动到一个新的,更安全的位置,同时在路上避免流星砸到。

报道说,在时间Ti(0≤Ti≤1000)的情况下,M(1 ≤ M ≤ 50,000) 颗流行将会坠落(strike),流星i会摧毁点  (XiYi) (0 ≤ X≤ 300; 0 ≤ Y≤ 300)。每颗流星都破坏了它撞击的点,也破坏了该点的四个相邻的格子点

贝西在时间0的时候离开原点,可以在第一象限移动,并以每秒一个距离单位的速度移动到任何一个(通常是4)相邻的方格点,而不是被流星摧毁。她不能在任何时候都处于大于或等于它被毁灭的时间。

确定贝西到达一个安全地点的最小时间。

Input

* Line 1: A single integer: M
* Lines 2..M+1: Line i+1 contains three space-separated integers: XiYi, and Ti

Output

* Line 1: The minimum time it takes Bessie to get to a safe place or -1 if it is impossible.

Sample Input

4
0 0 2
2 1 2
1 1 2
0 3 5

Sample Output

5

 1 /*
 2     Name: 
 3     Copyright: 
 4     Author: 
 5     Date: 29/08/17 13:37
 6     Description:  
 7             要判断能否避开流星雨的攻击
 8             在避开流星雨的攻击的情况下,还要求出最短时间
 9             数据特点:1、流行的颗数是固定   2、每一颗流星都会给出击中地点,以及倒计时  
10             限制:贝西每一秒只能移动一格,时间上的限制 
11 */
12 
13 #include<bits/stdc++.h>
14 using namespace std;
15 typedef pair<int,int>P;
16 const int MAX_M = 50000;
17 const int MAX_N = 400+1;
18 const int INF = 1<<30;
19 int M;
20 int X[MAX_M],Y[MAX_M],T[MAX_M];
21 int maze[MAX_N][MAX_N]; 
22 int d[MAX_N][MAX_N]; 
23 
24 /*学习到了,原来4个方向还是可以这样写的啊666*/
25 const int dx[4] = {-1,1,0,0};
26 const int dy[4] = {0,0,-1,1}; 
27 int bfs()
28 {
29     //一开始就轰炸
30     if(maze[0][0] == 0) return -1;
31      queue<P>que;  //这波操作真的是稳 
32      que.push(P(0,0));
33      d[0][0] = 0;
34      while(!que.empty()){
35          P p = que.front();
36          que.pop();
37         //已到达安全位置
38         int x = p.first,y = p.second;
39         if(maze[x][y] == INF) return d[x][y];
40         //4个方向逃
41         for(int i = 0; i < 4; i++)
42         {
43             int nx =  x + dx[i], ny = y + dy[i];
44             //判断是否移动,是否访问过,以及下一时刻是否安全
45             if(0 <= nx && 0 <=ny && d[nx][ny] == INF && d[x][y]+1 < maze[nx][ny])
46             {
47                 que.push(P(nx,ny));
48                 d[nx][ny] = d[x][y] + 1;
49             }    
50         } 
51      }
52      return -1;    
53 } 
54 
55 int main()
56 {
57     while(cin>>M)
58     {
59         for(int i = 0; i < M; i++)
60         {
61             scanf("%d%d%d",&X[i],&Y[i],&T[i]);
62         }
63         
64         //初始化地图
65         for(int i = 0; i < MAX_N; i++)
66             fill(maze[i],maze[i]+MAX_N,INF); /*原来二维数组初始化还有这波操作的6666*/
67         //模拟轰炸场景
68         for(int i = 0; i < M; i++){
69             maze[X[i]][Y[i]] = min(maze[X[i]][Y[i]],T[i]);
70             for(int j = 0; j < 4; j++){
71                 int nx = X[i]+dx[j],ny =Y[i]+dy[j];
72                 if(0 <= nx && 0 <= ny) //防止数组越界 
73                     maze[nx][ny] = min(maze[nx][ny],T[i]);
74             }
75         }
76         //初始化地图最小步数
77         for(int i = 0; i < MAX_N; i++)
78             fill(d[i],d[i] + MAX_N,INF);
79         //bfs
80         int ans = bfs();
81         printf("%d\n",ans);     
82     }
83     return 0;
84  } 

http://blog.csdn.net/acm_10000h/article/details/40863723

http://blog.csdn.net/liuchuo/article/details/52296646#comments

posted @ 2017-08-29 15:35  听说这是最长的名字了  阅读(167)  评论(0编辑  收藏  举报