首页 > 其他分享 >[USACO08FEB]meteor Shower S题解(bfs)

[USACO08FEB]meteor Shower S题解(bfs)

时间:2023-10-11 22:13:52浏览次数:45  
标签:格子 int 题解 310 t1 Shower leq 贝茜 USACO08FEB

题目描述

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

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

根据预报,一共有 \(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\) 开始行动,她只能在第一象限中,平行于坐标轴行动,每 \(1\) 个时刻中,她能移动到相邻的(一般是 \(4\) 个)格子中的任意一个,当然目标格子要没有被烧焦才行。如果一个格子在时刻 \(t\) 被流星撞击或烧焦,那么贝茜只能在 \(t\) 之前的时刻在这个格子里出现。 贝茜一开始在 \((0,0)\)。

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

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

样例输出 #1

5

解题思路

  1. 本题求能够到达安全地方所使用的最短时间,安全地方指永远都不会有陨石落下来的地方。要求最短时间,所以考虑用bfs做,用队列存储当前到达的坐标的信息。
  2. 题目需要特殊处理的地方在于:
    1)某一点不安全的时间取决于它自己以及上下左右四个点有陨石落下的最小值(除0之外),因此该点是否能经过,取决于最早到达该点时的时间是否小于最早陨石降落的时间;
    2)题中没有限定只能在坐标300以内走,因此判断的时候要开大一点,如305,才能考虑到可以在外圈走的情况;
    3)最后需要做特判,如果第0秒坐标原点就有陨石了,那么就game over了。
#include <stdio.h>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int t[310][310], t1[310][310], t_arr[310][310];
bool flag[310][310];
//上下左右四个方向
int dx[4] = {0 , 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
queue<pair<int, int>> q;

int main(){
    int m, x, y;
    //初始化陨石到达时间
    for(int i = 0; i <= 305; i++){
        for(int j = 0; j <= 305; j++)   t[i][j] = 1005;
    }
    cin >> m;
    for(int i = 1; i <= m; i++){
        cin >> x >> y;
        cin >> t[x][y];
    }
    //求当前位置陨石最早到达的时间,如果是安全地方,则t1为1005
    for(int i = 0; i <= 305; i++){
        for(int j = 0; j <= 305; j++){
            t1[i][j] = min(t[i][j], t[i+1][j]);
            t1[i][j] = min(t1[i][j], t[i][j+1]);
            if(j-1 >= 0)    t1[i][j] = min(t1[i][j], t[i][j-1]);
            if(i-1 >= 0)    t1[i][j] = min(t1[i][j], t[i-1][j]);
        }
    }
    //特判
    if(t1[0][0] == 0){
        cout << 0 << endl;
        return 0;
    }
    //bfs
    q.push(make_pair(0,0));
    t_arr[0][0] = 0;
    flag[0][0] = 1;
    while(!q.empty()){
        pair<int, int> p1;
        p1 = q.front();
        int x = p1.first, y = p1.second;
        q.pop();
        //如果该坐标是安全的,则输出当前坐标的到达时间
        if(t1[x][y] == 1005){
            cout << t_arr[x][y] << endl;
            return 0;
        }
        //超出范围,不入队,注意大于305
        else if(x < 0 || y < 0 || x > 305 || y > 305 || t_arr[x][y] >= t1[x][y]) {
            continue;
        }
        //向四个方向扩散,入队
        for(int i = 0; i < 4; i++){
            if(!flag[x+dx[i]][y+dy[i]]){
                q.push(make_pair(x+dx[i], y+dy[i]));
                flag[x+dx[i]][y+dy[i]] = 1;
                t_arr[x+dx[i]][y+dy[i]] = t_arr[x][y] + 1;
            }
        }
    }
    cout << -1 << endl;
    return 0;
}

标签:格子,int,题解,310,t1,Shower,leq,贝茜,USACO08FEB
From: https://www.cnblogs.com/hsy2093/p/17758326.html

相关文章

  • FileZilla 超时连接失败问题解决办法
    1.确保ubuntu支持FTP   就是安装ssh。      首先查看你有没有:sudops-e|grepssh红色箭头存在就代表你有的!如果没有那就去安装吧!2.确保ubuntu和windouws都关闭防火墙!【1】ubuntu打开终端输入:sudoufwdisable就会出现【2】windows中在搜索框中搜索防火墙:关闭......
  • 网络规划设计师真题解析--SNMP管理(安全威胁)
    在网络管理中要防范各种安全威胁。在SNMP管理中,无法防范的安全威胁是(35)。A.篡改管理信息:通过改变传输中的SNMP报文实施未经授权的管理操作B.通信分析:第三者分析管理实体之间的通信规律,从而获取管理信息C.假冒合法用户:未经授权的用户冒充授权用户,企图实施管理操作D.截获:未经授权......
  • P1457 [USACO2.1] 城堡 The Castle 题解
    分析感觉没有蓝题难度一道bfs题目,相较于大部分bfs题,它较为复杂,但分析一下还是很好水过的。建立墙时,可以用三维数组,\(wall_{~i,~j,~pos}\)表示第\(i\)行第\(j\)列\(pos\)方向有墙。观察发现,\(8=2^3,4=2^2,2=2^1,1=2^1\),于是可以用位运算快速储存。这里给出......
  • Ubuntu无法联网问题解决
    前言会有不同种原因导致系统无法联网,我遇到的可能只是其中一种,建议多问问ChatGPT,每一步遇到的问题问问人家应该能解决我遇到的情况是,之前一直能联网,然后一段时间不登就连不上网,然后又好了,然后又连不上网因此也把我这种情况的解决方案记录一下,以备不时之需   解决步骤......
  • Shuffle 题解
    Shuffle题目大意给定一个长度为\(n\)的01序列\(a\),你可以进行至多一次以下操作:选定\(a\)的一个连续段,满足连续段内恰好有\(k\)个\(1\),将该连续段任意排列。问能产生多少种不同的01序列。思路分析(这题\(n\)完全可以开到\(10^6\)或是\(10^7\),因为存在\(O(......
  • Hadoop问题解决(5)
    当一个HDFS系统同时处理许多个并行的put操作,往HDFS上传数据时,有时候会出现dfsclient端发生socket链接超时的报错,有的时候甚至会由于这种原因导致最终的put操作失败,造成数据上传不完整。log类似如下:Alldatanodes ***arebad.Aborting...类似这样的错误,常常会在并行的put操作......
  • Debian12安装MySQL8实践及问题解决方案
    Debian12安装MySQL数据库,常规操作:sudoaptsearchmysql&sudoaptinstallmysql,肯定是行不通的,因为没有安装包。把我的安装过程以及遇到问题的解决方案记录下来,供大家借鉴。第一步更新系统、下载软件包命令如下:sudoaptupdatewgethttps://dev.mysql.com/get/mysql-apt-co......
  • 【题解 P3586】 LOG
    [POI2015]LOG题目描述维护一个长度为\(n\)的序列,一开始都是\(0\),支持以下两种操作:Uka将序列中第\(k\)个数修改为\(a\)。Zcs在这个序列上,每次选出\(c\)个正数,并将它们都减去\(1\),询问能否进行\(s\)次操作。每次询问独立,即每次询问不会对序列进行修改。输......
  • 题解 AcWing 359.创世纪
    题目描述给你一个\(n\)个点\(n\)条边的有向图,若选了当前节点,那么当前节点的儿子节点至少有一个不能选。求最多能选多少个点。具体思路显然是一棵基环树,因此考虑基环树dp。我们先不管环的条件,先考虑朴素的树形dp。设\(f_{x,0}\)表示\(x\)节点不选,最多可以选多少个......
  • 网络规划设计师真题解析--位示图大小计算
    假设某计算机的字长为32位,该计算机文件管理系统磁盘空间管理采用位示图,记录磁盘的使用情况,若磁盘的容量为300GB,物理块的大小为4MB,那么位示图的大小为(2)个字。(2020年)(2)A.2400 B.3200 C.6400 D.9600答案:A解析:已知磁盘容量为300GB,物理块大小为4MB则计算物理块数=300*1024/4=76800(个)位......