首页 > 其他分享 >广度优先搜索 洛谷P2895Meteor Shower S

广度优先搜索 洛谷P2895Meteor Shower S

时间:2024-05-22 18:41:11浏览次数:22  
标签:洛谷 temp di int 贝茜 P2895Meteor Shower leq time

广度优先搜索

洛谷P2895

[USACO08FEB] Meteor Shower S

题面翻译

题目描述

贝茜听说一场特别的流星雨即将到来:这些流星会撞向地球,并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑,发誓要找到一个安全的地方(一个永远不会被流星摧毁的地方)。

如果将牧场放入一个直角坐标系中,贝茜现在的位置是原点,并且,贝茜不能踏上一块被流星砸过的土地。

根据预报,一共有 $M$ 颗流星 $(1\leq M\leq 50,000)$ 会坠落在农场上,其中第 $i$ 颗流星会在时刻 $T_i$($0 \leq T _ i \leq 1000$)砸在坐标为 $(X_i,Y_i)(0\leq X_i\leq 300$,$0\leq Y_i\leq 300)$ 的格子里。流星的力量会将它所在的格子,以及周围 $4$ 个相邻的格子都化为焦土,当然贝茜也无法再在这些格子上行走。

贝茜在时刻 $0$ 开始行动,她只能在会在横纵坐标 $X,Y\ge 0$ 的区域中,平行于坐标轴行动,每 $1$ 个时刻中,她能移动到相邻的(一般是 $4$ 个)格子中的任意一个,当然目标格子要没有被烧焦才行。如果一个格子在时刻 $t$ 被流星撞击或烧焦,那么贝茜只能在 $t$ 之前的时刻在这个格子里出现。 贝茜一开始在 $(0,0)$。

请你计算一下,贝茜最少需要多少时间才能到达一个安全的格子。如果不可能到达输出 $−1$。

输入格式

共 $M+1$ 行,第 $1$ 行输入一个整数 $M$,接下来的 $M$ 行每行输入三个整数分别为 $X_i, Y_i, T_i$。

输出格式

贝茜到达安全地点所需的最短时间,如果不可能,则为 $-1$。

题目描述

Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will crash into earth and destroy anything they hit. Anxious for her safety, she vows to find her way to a safe location (one that is never destroyed by a meteor) . She is currently grazing at the origin in the coordinate plane and wants to move to a new, safer location while avoiding being destroyed by meteors along her way.

The reports say that M meteors (1 ≤ M ≤ 50,000) will strike, with meteor i will striking point (Xi, Yi) (0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300) at time Ti (0 ≤ Ti  ≤ 1,000). Each meteor destroys the point that it strikes and also the four rectilinearly adjacent lattice points.

Bessie leaves the origin at time 0 and can travel in the first quadrant and parallel to the axes at the rate of one distance unit per second to any of the (often 4) adjacent rectilinear points that are not yet destroyed by a meteor. She cannot be located on a point at any time greater than or equal to the time it is destroyed).

Determine the minimum time it takes Bessie to get to a safe place.

输入格式

* Line 1: A single integer: M

* Lines 2..M+1: Line i+1 contains three space-separated integers: Xi, Yi, and Ti

输出格式

* Line 1: The minimum time it takes Bessie to get to a safe place or -1 if it is impossible.

样例 #1

样例输入 #1

4
0 0 2
2 1 2
1 1 2
0 3 5

样例输出 #1

5

可先看我的另一个博客

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

这里写几个坑点:

  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");
}

标签:洛谷,temp,di,int,贝茜,P2895Meteor,Shower,leq,time
From: https://www.cnblogs.com/rjxq/p/18206882

相关文章

  • 二分答案 洛谷P3853路标设置
    这个题思路和洛谷P2440有点像,建议先看P2440这个题,较简单。[TJOI2007]路标设置题目背景B市和T市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题,我们把公路上相邻路标的最......
  • 广度优先搜索 洛谷P1443马的遍历(bfs超时问题)
    广度优先搜索洛谷P1443这里先介绍一下广度优先搜索:广度优先搜索就是先将第一步可能的步骤全部记录,遍历过后,再将由第一步到达的第二步全部记录并遍历,直到最后全部遍历。而此题要求我们求得最少步数,广度优先就能够达到最少步数的要求,因为广度优先是先通过搜索所有可能的第n步才......
  • 深度优先搜索 洛谷P1219八皇后
    深度优先搜索洛谷P1219这是一道经典的深度优先搜索问题,深度优先搜索可用以下模板:voiddfs(intdepth){ if(达到边界){ 记录解 } for(枚举在depth这一深度,能够使用的解){ if(解可行){ 记录解(记录已经被使用) dfs(depth+1) 恢复解(恢复原状) } }}题目要求我们......
  • 二分答案 洛谷2440木材加工
    二分答案题目详见洛谷P2440木材加工分享一下自己新学习的二分答案的方法,开始可能有点奇怪为啥这样能做,但其实思路很简单。起始思路题目要求我们求最大的分解长度,所以我(们)最开始想的肯定是从大到小(求最大值)枚举答案,看看是否满足,满足不了就加1。但这样暴力肯定是会超时的,那我们......
  • 洛谷 P4383 [八省联考 2018] 林克卡特树
    原题等价于在树上选出\(k+1\)条不相交链,最大化边权和。树形DP。设\(f_{u,k,0/1/2}\)表示在\(u\)的子树中选了\(k\)条链,\(u\)的度数为\(0,1,2\)的最大边权和。注意到状态里缺了链退化为单个点的情况,可以把它放到\(f_{u,k,2}\)中(相当于自环)。转移时分讨一......
  • 洛谷 P10512 序列合并
    哭死,比赛的时候完全想歪了,想的是考虑一次合并能造成多大的贡献,按照贡献排序然后合并。这样做只能考虑局部造成的贡献,然而最后算的时候要考虑整体,所以并不是很对。正着想没有思路就可以倒着想,考虑枚举答案。合并k次,意味着最后是n-k个数。经典从二进制高位到低位考虑,考虑这一位(假......
  • Solution -「洛谷 P8477」 「GLR-R3」春分 下界证明?!
      前情提要:在「洛谷P8477」「GLR-R3」春分中,我们给出了\(\frac{7}{6}n\pm\mathcalO(1)\)的解法,但没能给出相关的下界证明。现在我们尝试给出一个未完全完成的下界证明。  为方便描述,我们综合链接中题意和某个“通俗”的题意,称隔板为“板”,称溶液为“人”。  这个......
  • 「杂题乱刷」洛谷 P10467
    题目链接P10467[CCC2007]SnowflakeSnowSnowflakes解题思路字符串哈希板子题。思路就是我们给每个数列的所有排列都哈希一个值,然后判断是否有不同的数列的哈希值相同,如果有,就输出Twinsnowflakesfound.,否则就输出Notwosnowflakesarealike.。参考代码这里使用双哈......
  • 「杂题乱刷」洛谷 P10468 兔子与兔子
    题目链接P10468兔子与兔子解题思路字符串哈希板子题。思路就是我们给字符串的每一个前缀和后缀都用一种特定的方式使其变为一个值,比如取一个乘数和模数,可以证明这样出错的概率极低。参考代码这里使用自然溢出三哈希。#include<bits/stdc++.h>usingnamespacestd;#defin......
  • 洛谷题单指南-动态规划3-P1220 关路灯
    原题链接:https://www.luogu.com.cn/problem/P1220题意解读:按坐标顺序排列1~n个路灯,每个路灯有不同的功耗,老张从位置c开始关灯,第一时间关掉c位置的灯,每次关掉一个灯之后,可以往右走、也可以往左走关下一个灯,老张速度是1m/s,求所有灯都关掉所消耗的最少功耗。解题思路:由题意分析,关......