小超手123 @ 2021-08-22 22:08:31
#include <bits/stdc++.h>
using namespace std;
struct coord {
int x, y;
};
queue<coord> Q;
int ans[310][310]; //记录到达安全的点的时间
int death[310][310]; //记录每个点被流星雨砸中的时间
int next[5][3] = { { 0, 1 }, { 1, 0 }, { -1, 0 }, { 0, -1 } };
int main() {
int m, Ans = 100000;
memset(ans, -1, sizeof(ans)); //把-1赋值给ans数组
memset(death, 0x7f, sizeof(death)); //把death数组赋值最大化
cin >> m;
for (int i = 1; i <= m; i++) {
int x, y, t;
cin >> x >> y >> t;
#define MIN(x, y, t) \
if (x >= 0 && y >= 0) \
death[x][y] = min(death[x][y], t); //流星砸下时间已最早的那个为准
MIN(x, y, t);
for (int i = 0; i < 4; i++) //记录烧焦时间
MIN(x + next[i][0], y + next[i][1], t);
}
Q.push((coord){ 0, 0 }); //把起点(0,0)入队,coord强制转化结构体
ans[0][0] = 0;
while (!Q.empty()) {
coord u = Q.front(); //把队首赋给u
int ux = u.x, uy = u.y; //记录扩展前坐标
Q.pop(); //把之前的数据扔了
for (int i = 0; i < 4; i++) { //向四个点扩展
int xx = ux + next[i][0], yy = uy + next[i][1]; //记录扩展后坐标
if (xx < 0 || yy < 0 || ans[xx][yy] != -1 || ans[ux][uy] + 1 >= death[xx][yy])
continue; //超过地图或走过或时间超过了就跳出
ans[xx][yy] = ans[ux][uy] + 1; //记录此地点用时
Q.push((coord){ xx, yy }); //入队
}
}
for (int i = 0; i < 305; i++)
for (int j = 0; j < 305; j++)
if (death[i][j] > 1000 && ans[i][j] != -1) //安全点且走到了
Ans = min(Ans, ans[i][j]); //记录最短用时
if (Ans == 100000) //用时没变就没走到
cout << -1;
else
cout << Ans;
return 0;
}
by PragmaGCC @ 2021-08-22 22:11:08
讨论区题解?
by 小超手123 @ 2021-08-22 22:13:07
不是 为什么洛谷对了 我的电脑都不行
by 小超手123 @ 2021-08-22 22:16:26
我这烂电脑呀
by ADay @ 2021-08-22 22:22:35
@PragmaGCC Orz这么晚了还在卷