poj 3669 Meteor Shower
题目大意:
Bessie 为了躲避流星攻击,从原点出发每秒移动一格。流星在T时会砸到一个坐标,该坐标和周围四个格都会被破坏。问Bessie最短需花多少时间逃离到永远不会遭到袭击的地方。
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 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 int dir[][2] = {{0,1}, {0,-1},{-1,0},{1,0}}; 8 9 int m; 10 int dtime[302][302]; 11 int ptime[302][302]; 12 13 typedef pair<int, int> Point; 14 queue <Point> que; 15 int main(int argc, char const *argv[]) 16 { 17 //freopen("input.txt","r",stdin); 18 scanf("%d",&m); 19 for(int i = 0; i < 302; i++) { 20 for(int j = 0; j < 302; j++) { 21 dtime[i][j] = 1002; 22 ptime[i][j] = -1; 23 } 24 } 25 while(m--) { 26 int a, b, d; 27 scanf("%d %d %d",&a,&b,&d); 28 dtime[a][b] = min(dtime[a][b],d); 29 for(int i = 0; i < 4; i++) { 30 int tx = a + dir[i][0]; 31 int ty = b + dir[i][1]; 32 if(tx >= 0 && ty >= 0 && tx < 302 && ty < 302) { 33 dtime[tx][ty] = min(dtime[tx][ty], d); 34 } 35 } 36 } 37 que.push(Point(0,0)); 38 ptime[0][0] = 0; 39 int min = 9999999; 40 41 while(!que.empty()) { 42 Point tp = que.front(); que.pop(); 43 int tpx, tpy; 44 int t = ptime[tp.first][tp.second]; 45 if(t > min) { 46 continue; 47 } 48 if(dtime[tp.first][tp.second] == 1002) { 49 if(t < min) { 50 min = t; 51 } 52 continue; 53 } 54 for(int i = 0; i < 4; i++) { 55 int tpx = tp.first + dir[i][0]; 56 int tpy = tp.second + dir[i][1]; 57 if(tpx >= 0 && tpy >= 0 && tpx < 302 && tpy < 302 && ptime[tpx][tpy] == -1) { 58 if(t+1 < dtime[tpx][tpy]) { 59 que.push(Point(tpx, tpy)); 60 ptime[tpx][tpy] = t+1; 61 } 62 } 63 } 64 } 65 if(min != 9999999) { 66 printf("%d\n", min); 67 } 68 else { 69 puts("-1"); 70 } 71 return 0; 72 }
做题时遇到的问题:
一开始没有判断使其不能回到走过的地方
一开始t没有加一操作,加上加一操作时的位置一开始也不对
注意到的点:
28行,33行min()的使用
注意如果无可行解要输出-1