POJ 3669:Meteor Shower(bfs)

原题地址:点击打开链接

描述

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

报道说,  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 302

using 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;

你可能感兴趣的:(算法,C语言,poj,bfs)