广度优先搜索 洛谷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");
}
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值