题目链接: POJ 3669 Meteor Shower

题目大意:

你在坐标原点, 只能在第一象限沿着x,y轴方向移动, 单位时间内一次移动一格。马上将要迎来一场流星雨, 也只会落到第一象限, 每颗流行砸下来, 会毁掉它降落的位置以及直接相邻的上下左右四个位置。在某一块地区被流星摧毁后, 你不能再来这个地方。
一共有M颗流星, 每颗的坐标Xi,YiX_i, Y_i 以及降落时间TiT_i 已知。
求你能到达安全地带的最短时间

题解:

求到达安全地带所需的最短时间, 容易想到用bfs。和走迷宫找最短路径不同的是, 这里的地图是随着时间变化的,因为不同流星落降落时间是不同的。
我的解法:

首先,根据所有的流星的降落位置, 计算出最后状态的地图,记作safe[][]safe[][] , 这样就知道哪里是安全的, 哪里是不安全的。
先按照时间顺序给流星排个序,
然后, 每次宽搜,要在宽搜节点中加入一个时间属性。如果时间状态为 ii 的节点都已经宽搜结束, 则需要更新地图的时间状态为 i+1i+1 , 然后在进行 i+1i+1 的时间状态的搜索。
我用了一个num[i]num[i] 数组来存放时间状态为i<script type="math/tex" id="MathJax-Element-144">i</script> 的节点的个数。 num[i] 为0 时,则更新地图。

用自己的方法AC之后, 找了别人的题解, 发现其实并不需要这样随着时间来更新地图, 可以用地图记录每个地方第一次被摧毁的时间。这样地图本身就有了时间属性。

代码:

#include <iostream>
#include <queue>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define MAXM 50010
#define MAXX 310
using namespace std;struct Meteor {int x, y, t;
}m[MAXM];
int M, ans;
int safe[MAXX][MAXX];
int map[MAXX][MAXX];
bool f[MAXX][MAXX];
int num[MAXM];
int fx[] = {0, 1, 0, -1};
int fy[] = {1, 0, -1, 0};
queue<Meteor> q;bool cmp(const Meteor &a, const Meteor &b) {return a.t < b.t;
}//摧毁
void boom(int (*a)[MAXX], int x, int y) {a[x][y] = 1;a[x-1][y] = 1;a[x][y-1] = 1;a[x+1][y] = 1;a[x][y+1] = 1;
}bool is_safe(int x, int y) {if (x > 0 && y > 0 && !safe[x][y]) return true;else return false;
}
int bfs() {memset(f, false, sizeof(f));memset(num, 0, sizeof(num));Meteor o = {1, 1, 0};q.push(o);int cnt = 0;int p = 0;f[1][1] = true;num[0] = 1;//更新0时间的地图for (; m[p].t == cnt; p++) boom(map, m[p].x, m[p].y);cnt++;//更新1时间的地图for (; m[p].t == cnt; p++) boom(map, m[p].x, m[p].y);cnt++;while (!q.empty()) {Meteor a = q.front();q.pop();int x, y, t;x = a.x; y = a.y; t = a.t;if (is_safe(x, y)) {return t;}for (int i = 0; i < 4; i++) {int tx = x + fx[i];int ty = y + fy[i];if (0 < tx && 0 < ty && !map[tx][ty] && !f[tx][ty]) {f[tx][ty] = true;Meteor tmp = {tx, ty, t+1};q.push(tmp);num[t+1]++;}}num[t]--;if (!num[t]) {//更新cnt时间的地图for (; p < M && (m[p].t == cnt); p++) {boom(map, m[p].x, m[p].y);}cnt++;}}return -1;
}int main() {memset(safe, 0, sizeof(safe));memset(map, 0, sizeof(map));scanf("%d", &M);for (int i = 0; i < M; i++) {scanf("%d%d%d", &m[i].x, &m[i].y, &m[i].t);m[i].x++; m[i].y++;boom(safe, m[i].x, m[i].y);}sort(m, m+M, cmp);ans = bfs();printf("%d\n", ans);return 0;
}

POJ 3669-Meteor Shower [bfs] 《挑战程序设计竞赛》2.1相关推荐

  1. POJ 3669 Meteor Shower 流星雨 解题思路心得 BFS广搜 C/C++AC代码(另有TLE不知其因)

    原题 http://poj.org/problem?id=3669 题意 贝西(Bessie)听说即将发生一场异常的流星雨;有报道称这些流星将坠入大地并摧毁其所击中的任何东西,为安全着急,她发誓要找到 ...

  2. POJ 3669 Meteor Shower

    暴力DFS. 有2个剪枝: 1.记录一下走到某一格的最小步数 2.走到安全地点马上return WA点:安全地点坐标不一定在300以内! #include<cstdio> #include ...

  3. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  4. 挑战程序设计竞赛——详解DFS及BFS

    挑战程序设计竞赛--详解DFS及BFS 一.学会要用到的stl函数,Stack.Quene.Pair 1.Stack(DFS隐式的用到,并与Queue对比记忆) 头文件==#include== sta ...

  5. 《挑战程序设计竞赛》--初级篇习题POJ部分【2.4 - 2.6】

    这次是延续上次的<挑战程序设计竞赛>初级篇,总结部分poj上的练习题,主要是2.4 ~ 2.6部分: 导航 2.4 加工并存储的数据结构 优先队列 Sunscreen MooUnivers ...

  6. 《挑战程序设计竞赛》--初级篇习题POJ部分【穷竭搜索+贪心】

    最近看了<挑战程序设计竞赛>初级篇,这里总结一下部分poj上的练习题,主要涉及方面为: 穷竭搜索 and 贪心算法 具体题目: 简单导航 一.穷竭搜索 二.贪心算法 一.穷竭搜索 穷竭搜索 ...

  7. POJ 1150 The Last Non-zero Digit 《挑战程序设计竞赛》

    为什么80%的码农都做不了架构师?>>>    POJ 1150 The Last Non-zero Digit超大组合数:求超大组合数P(n, m)的最后一个非零位.4.1更加复杂 ...

  8. POJ 3735 Training little cats​ 题解 《挑战程序设计竞赛》

    为什么80%的码农都做不了架构师?>>>    POJ 3735 Training little cats调教猫咪:有n只饥渴的猫咪,现有一组羞耻Play,由k个操作组成,全部选自: ...

  9. POJ 3608 Bridge Across Islands 《挑战程序设计竞赛》

    为什么80%的码农都做不了架构师?>>>    POJ 3608 Bridge Across Islands跨岛大桥:在两个凸包小岛之间造桥,求最小距离?3.6与平面和空间打交道的计 ...

最新文章

  1. Storyboard里面的几种Segue区别及视图的切换:push,modal,popover,replace和custom
  2. vue中slot(插槽)详解,slot、slot-scope和v-slot
  3. 公积金10万元,为何却不能贷款买房?
  4. python print(len(pi_string))_Python如何从文件中读取数据
  5. 小米MIX 4 8月不会发布:或配屏下摄像头/100W快充
  6. mri计算机系统,MRI设备
  7. CentOS7在/etc/grub2.conf引导中配置1G大页内存
  8. 约瑟夫问题(vector的使用)
  9. linux操作系统使用论文_Linux学习2 使用VirtualBox安装国产深度操作系统
  10. 用Keil+CMSIS DAP调试NXP S32系列单片机时遇到的问题
  11. 昆腾的反思:对象存储解困大数据
  12. Win7手工查找notepad.exe的IAT
  13. MaterialDrawer库的Gradle配置
  14. 你绝对不知道 Vue 也有生老病死
  15. wifi自动连接,断开连接,打开和关闭,亲测有效
  16. Helio P10 (MT6755)
  17. 埃拉托色尼筛法(素数筛)
  18. delphi7解决“多步操作产生错误,请检查每一步的状态”的办法
  19. STM32的矩阵按键程序思路
  20. 巴西龟饲养日志----冬眠记录2

热门文章

  1. Matplotlib中annotate详解
  2. 2021年中国显示器行业产量、出货量及出口情况分析:显示器出口数量减少,出口金额增加[图]
  3. CSS如何实现双飞翼布局?
  4. SAM大模型遥感领域测评
  5. Vue 图片、PDF预览(Blod数据类型)
  6. 网民评选07年搞笑新闻榜 华南虎事件列第一
  7. matlab三维图像比较,matlab 画三维图像
  8. 进程和线程的主要区别(总结)
  9. DataX系列10-DataX优化
  10. 灵动微MM32的FSMC接口驱动TFT_LCD屏幕