首页 > 代码库 > POJ 3669
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 }
POJ 3669
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。