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