ACM Meteor Shower
贝茜听到一场非同寻常的流星雨( meteor shower)即将来临;有报道称这些流星将撞击地球并摧毁它们所击中的任何东西。为了安全起见(Anxious for her safety), ,她发誓(vows)要找到一条路到安全的地方(一个从未被流星摧毁的地方)。目前,她在坐标轴(coordinate plane)的原点上,想要移动到一个新的,更安全的位置,同时在路上避免流星砸到。
报道说,在时间Ti(0≤Ti≤1000)的情况下,M(1 ≤ M ≤ 50,000) 颗流行将会坠落(strike),流星i会摧毁点 (Xi, Yi) (0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300)。每颗流星都破坏了它撞击的点,也破坏了该点的四个相邻的格子点
贝西在时间0的时候离开原点,可以在第一象限移动,并以每秒一个距离单位的速度移动到任何一个(通常是4)相邻的方格点,而不是被流星摧毁。她不能在任何时候都处于大于或等于它被毁灭的时间。
确定贝西到达一个安全地点的最小时间。
Input
* Line 1: A single integer: M
* Lines 2..M+1: Line i+1 contains three space-separated integers: Xi, Yi, 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