POJ 3669:Meteor Shower(bfs)

来源:互联网 发布:手机有透视软件吗 编辑:程序博客网 时间:2024/06/05 06:45

原题地址:点击打开链接

描述

贝西听到一个非凡的流星雨来了, 报道说,这些流星撞击地球并摧毁任何东西。担心她自己的安全,她发誓要找到一个安全的地方(从未被一颗流星摧毁)。她目前正在坐标平面的原点,想搬到一个新的、更安全的位置,同时避免被流星摧毁她经过的路。

报道说,  M颗流星(1M50,000)将下落,流星i将在时间Ti(0Ti1000)落在(Xi, Yi) (0Xi,  Yi300)位置。每个流星下落点被破坏时也会破坏四个相邻的点。

贝西离开原点为0时刻,她可以在第一象限移动,平行于坐标轴每秒一个距离的速度,她可以移到相邻直线点,这个点不能是一个已经被摧毁的点(时间大于或等于它被摧毁)

求贝茜到达一个安全的地方的最少时间。

 

输入:

1行:M

2行到M + 1: Xi, Yi, Ti

 

输出:

贝茜到达一个安全地方的最少时间, 不可能达到安全的地方输出 -1

时间限制: 1000 ms

内存限制: 1000 kb

 

Sample Input

4

0 0 2

2 1 2

1 1 2

0 3 5

Sample Output

5


分析:

记录地图每个位置最早被炸毁的时间,然后用dfs向从起点向四个方向走,记录到达每个位置的最短时间,直到找到一个安全位置

 

答案:

#include <iostream>#include <cstring>#include <queue>#define MAX_M 50000#define MAX_X 302#define MAX_Y 302using namespace std;typedef struct{int x, y;}Point;int m, xi[MAX_M], yi[MAX_M], ti[MAX_M], lastT;int desTime[MAX_X][MAX_Y], visTime[MAX_X][MAX_Y];int dx[] = {0, 0, 1, -1, 0}, dy[] = {1, -1, 0, 0, 0};int bfs(){if(0 == desTime[0][0])return -1;Point p = {0, 0};queue<Point> que;visTime[0][0] = 0;que.push(p);while(que.size()){p = que.front();que.pop();if(desTime[p.x][p.y] > lastT)return visTime[p.x][p.y];for(int i = 0; i < 4; i ++){Point np = {p.x + dx[i], p.y + dy[i]};int t = visTime[p.x][p.y] + 1;if(np.x >= 0 && np.y >= 0 && 0 > visTime[np.x][np.y] && t < desTime[np.x][np.y]){visTime[np.x][np.y] = t;que.push(np);}}}return -1;}void SetTime(int x, int y, int t){for(int i = 0; i < 5; ++ i){int nx = x + dx[i], ny = y + dy[i];if(nx >= 0 && ny >= 0 && t < desTime[nx][ny])desTime[nx][ny] = t;}}void solve(){lastT = ti[0];memset(desTime, 0x7f, sizeof(desTime));memset(visTime, -1, sizeof(visTime));for(int i = 0; i < m; i ++){SetTime(xi[i], yi[i], ti[i]);if(ti[i] > lastT)lastT = ti[i];}cout << bfs() << endl;}int main(){while(cin >> m){for(int i = 0; i < m; i ++)cin >> xi[i] >> yi[i] >> ti[i];solve();}return 0;}
改了n次终于AC,原因是在bfs前面把


if(0 == desTime[0][0])return -1;
写成

if(0 == desTime[0][0] || 1<span style="font-size: 13.3333px; font-family: Arial, Helvetica, sans-serif;"> == desTime[0][0])</span><pre name="code" class="cpp" style="font-size: 13.3333px;">return -1;

结果看了半天,改了半天。。。。。

if(0 == desTime[0][0])return -1;
0 0
原创粉丝点击