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 }
View Code

 

posted @ 2014-11-12 22:15  A_dan  阅读(206)  评论(0编辑  收藏  举报