每日一题 几乎毁灭牛市的流星雨(bfs)

NC207759

NC207759

几乎毁灭牛市的流星雨
题目描述
考古队员发现,牛市之所以会有那么多古老遗迹,是因为牛市曾经遭遇过一场几乎毁灭了他的流星雨,那场流星雨中流星体积很大,无法在撞击到地面前燃烧完,所以对牛市几乎造成了毁灭性的打击,但是,我们牛市的先民也是很厉害的,他们对于流星雨的预报虽然没有提前太多的时间但是详细到了每颗流星坠落的位置,所以虽然牛市在那一场流星雨之后满目疮痍,但是牛市的百姓大多都存活了下来。因为自然环境受到了巨大的破坏,他们记录下了这段历史搬到其他的地方繁衍生息,很多代人之后,牛市的自然环境有了恢复,他们后代中的一些人又搬了回来,逐渐建成了现在的牛市。这段历史被遗忘被尘封多年,但终于还是没有被遗忘……
根据遗迹中某个记载,当时先民们预报了一共有M颗流星(1≤M≤50,000)会坠落,他们将牛市划分成网格,他们预报其中第i颗流星会在时Ti(0≤Ti≤1,000)砸在坐标为(Xi,Yi)(0<=Xi<=300,0<=Yi<=300)的格子里。流星的力量会将它所在的格子,以及周围4个相邻的格子都化为焦土,在整个流星雨结束之前,这些格子都将无法行走站立。
现在有一个家族,在0时刻在0行0列的格子里,因为道路和建筑的原因,他们只能平行于坐标轴行动,每1个时刻,他们能移动到相邻的4个格子中的任意一个,当然这个格子要没有被撞击烧焦才行。(也就是说如果一个格子在时刻t被流星撞击或烧焦,那么他们只能在t之前的时刻在这个格子里出现。)
请你计算,这个家族是否在这场流星雨中幸存(移动到了一个没有被撞击或者烧焦的格子里一直待到流星雨结束),如果幸存,他们最少要花多少时间才移动到安全的格子里。
注:虽然流星只是砸在x,y坐标300的范围内,但是我们可以认为牛市在整个第一象限之内,即移动过程中x和y都可以超出300(但不能为负)。
输入描述:
第1行: 1个正整数:M
第2…M+1行: 第i+1行为3个用空格隔开的整数:Xi,Yi,Ti
输出描述:
输出1个整数,即这个家族逃生所花的最少时间。如果这个家族无论如何都无法在流星雨中存活下来,输出-1

示例1
输入

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

输出

5

这道题思路其实很直白.
广搜,找最短步数.
就是标记走过的点.
并且当该点在当前步数下已经毁坏,也算标记过.

但是,我琢磨了一晚上,主要是结构体和map的使用搞了很久.
坐标嘛,肯定是用结构体+map储存嘛.
但是我没用pair,自己写了个.
因为知道map内部会自带排序,结构体中要对优先度也进行说明.
所以我对横坐标小的优先,但是没有对纵坐标说明.

然后就出问题了,大概就是即使map中只有一个元素,随便查询(map.count())一个元素,都是返还为1.
具体什么原因我也不找了,反正最后解决方法就是结构体中所有情况都要考虑.
然后找原因的过程中发现
map.count(x)其实就是if(map.find(x)==map.end())

#include <cstdio>
#include <map>
#include <queue>
#include <utility>
using namespace std;
const int N = 310;
struct Node {
    int x, y;
    //这里所有情况都要考虑到,不然就会出现上面的情况
    bool operator<(const Node& a) const {
        if (x < a.x)
        {
            return true;
        } else if (x == a.x)
        {
            return y < a.y;
        }
        return false;
    }
};
map<Node, int> mp;
bool vis[N][N];
int d[][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
int dis[N][N];
int bfs() {
    if (!mp.count({0, 0})) {
        return 0;
    }
    vis[0][0] = true;
    queue<Node> que;
    que.push({0, 0});
    while (!que.empty()) {
        int x = que.front().x;
        int y = que.front().y;
        que.pop();
        int t = dis[x][y] + 1;
        for (int i = 0; i < 4; i++) {
            int nx = x + d[i][0];
            int ny = y + d[i][1];
            if (nx >= 0 && ny >= 0) {
                if (!mp.count({nx, ny})) {
                    return t;
                }
                if (vis[nx][ny] == false && mp[{nx, ny}] > t) {
                    vis[nx][ny] = true;
                    dis[nx][ny] = t;
                    que.push({nx, ny});
                }
            }
        }
    }
    return -1;
}
int main() {
    int n;
    scanf("%d", &n);
    int x, y, t;
    Node tmp;
    while (n--) {
        scanf("%d%d%d", &x, &y, &t);
        if (!mp.count({x, y}) || (mp[{x,y}] > t)) {
            mp[{x, y}] = t;
        }
        for (int i = 0; i < 4; i++) {
            tmp = Node{x + d[i][0], y + d[i][1]};
            if (tmp.x >= 0 && tmp.y >= 0) {
                if (!mp.count(tmp) || (mp[tmp] > t)) {
                    mp[tmp] = t;
                }
            }
        }
    }
    int ans = bfs();
    printf("%d", ans);
    return 0;
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值