原题地址:点击打开链接
描述
贝西听到一个非凡的流星雨来了, 报道说,这些流星撞击地球并摧毁任何东西。担心她自己的安全,她发誓要找到一个安全的地方(从未被一颗流星摧毁)。她目前正在坐标平面的原点,想搬到一个新的、更安全的位置,同时避免被流星摧毁她经过的路。
报道说, M颗流星(1≤M≤50,000)将下落,流星i将在时间Ti(0≤Ti≤1000)落在(Xi, Yi) (0≤Xi, Yi≤300)位置。每个流星下落点被破坏时也会破坏四个相邻的点。
贝西离开原点为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;