POJ 3669
题意:已知流星的颗数,落地的坐标和落地时间,若流星落在某点则该点周围的四点也会被波及,现在要求你到达一点没有被流星击过的点最少时间
注意:只能在第一象限内包括X,Y轴的正半轴
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cctype> 5 #include <cmath> 6 #include <time.h> 7 #include <string> 8 #include <map> 9 #include <stack> 10 #include <set> 11 #include <queue> 12 #include <vector> 13 #include <algorithm> 14 #include <iostream> 15 using namespace std; 16 typedef long long ll; 17 typedef pair<int,int> P; 18 #define PI acos( -1.0 ) 19 const double E = 1e-8; 20 const int INF = 0x7fffffff; 21 22 const int NO = 300 + 5; 23 int m[NO][NO]; 24 int step[NO][NO]; 25 int mark[NO][NO]; 26 int dir[][2] = { {-1,0}, {1,0}, {0,-1}, {0,1} }; 27 int n; 28 29 void init() 30 { 31 for( int i = 0; i < NO; ++i ) 32 for( int j = 0; j < NO; ++j ) 33 m[i][j] = INF; 34 } 35 36 void init1( int x, int y, int c ) 37 { 38 for( int i = 0; i < 4; ++i ) 39 { 40 int xx = x + dir[i][0]; 41 int yy = y + dir[i][1]; 42 if( xx >= 0 && yy >= 0 ) 43 m[xx][yy] = min( m[xx][yy], c ); 44 } 45 } 46 47 void bfs() 48 { 49 queue <P> q; 50 q.push( P( 0, 0 ) ); 51 mark[0][0] = 0; 52 memset( step, 0, sizeof( step ) ); 53 while( !q.empty() ) 54 { 55 P t = q.front(); q.pop(); 56 int x = t.first; 57 int y = t.second; 58 mark[x][y] = 0; 59 if( m[x][y] == INF ) 60 { 61 printf( "%d\n", step[x][y] ); 62 return; 63 } 64 for( int i = 0; i < 4; ++i ) 65 { 66 int dx = x + dir[i][0]; 67 int dy = y + dir[i][1]; 68 if( dx >= 0 && dy >= 0 && ( m[dx][dy] == INF || m[dx][dy] > step[x][y]+1 ) && !mark[dx][dy] ) 69 { 70 mark[dx][dy] = 1; 71 step[dx][dy] = step[x][y] + 1; 72 q.push( P( dx, dy ) ); 73 } 74 } 75 } 76 puts( "-1" ); 77 } 78 79 int main() 80 { 81 scanf( "%d", &n ); 82 int a, b, c; 83 init(); 84 for( int i = 0; i < n; ++i ) 85 { 86 scanf( "%d%d%d", &a, &b, &c ); 87 m[a][b] = min( m[a][b], c ); 88 init1( a, b, c ); 89 } 90 bfs(); 91 return 0; 92 }