广度优先搜索 洛谷P2895Meteor Shower S
广度优先搜索
洛谷P2895
可先看我的另一个博客
我们不需要根据时间来模拟,而是可以记录每个点的最早被影响时间,随后再进行搜索
这里写几个坑点:
- 初始化time数组为-1,不能为0,因为可能陨石在0时刻就降落
- 陨石先出现,影响了五个点,这五个点可能会被后面的陨石影响
比如,先输入1,1,5 ,(1,1),(0,1),(1,0),(1,2),(2,1)这5个点的time就会被覆盖为5,如果后输入2,1,3,那么(1,1)和(2,1)的time就要改为3。 - 还是像我的这个博客一样,超时问题
下面是ac代码
#include<bits/stdc++.h>
using namespace std;
struct pos {
int x, y;
int time;
};
int main() {
int m;
int time[310][310], flag[310][310] = {0};
memset(time, -1, sizeof(time));
int di[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
cin >> m;
for(int i = 0; i < m; i++) {
int x, y, t;
cin >> x >> y >> t;
if(time[x][y] == -1){
time[x][y] = t;
}
for(int j = 0; j < 4; j++) {
if(x+di[j][0] >= 0 && y+di[j][1] >= 0) {
if(time[x+di[j][0]][y+di[j][1]] == -1 || t < time[x+di[j][0]][y+di[j][1]]){
time[x+di[j][0]][y+di[j][1]] = t;
}
}
}
}
pos p; p.x = 0; p.y = 0; p.time = 0;
queue <pos> q;
q.push(p);
while(!q.empty() && time[q.front().x][q.front().y] != -1) {
int nx = q.front().x, ny = q.front().y, ntime = q.front().time;
for(int i = 0; i < 4; i++) {
if(nx+di[i][0] < 0 || ny+di[i][1] < 0) continue;
if(!flag[nx+di[i][0]][ny+di[i][1]]) {
if(time[nx+di[i][0]][ny+di[i][1]] == -1 || time[nx+di[i][0]][ny+di[i][1]] > ntime+1) {
pos temp; temp.x = nx+di[i][0]; temp.y = ny+di[i][1]; temp.time = ntime + 1;
flag[temp.x][temp.y] = 1;
q.push(temp);
}
}
}
q.pop();
}
if(q.empty()) cout << -1;
else cout << q.front().time << endl;
system("pause");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现