广度优先搜索 洛谷P2895Meteor Shower S

广度优先搜索

洛谷P2895

可先看我的另一个博客

我们不需要根据时间来模拟,而是可以记录每个点的最早被影响时间,随后再进行搜索

这里写几个坑点:

  1. 初始化time数组为-1,不能为0,因为可能陨石在0时刻就降落
  2. 陨石先出现,影响了五个点,这五个点可能会被后面的陨石影响
    比如,先输入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。
  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");
}
posted @   若把你比作歌  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示