Description - 题目描述

Bessie听说有场史无前例的流星雨即将来临;有谶言:陨星将落,徒留灰烬。为保生机,她誓将找寻安全之所(永避星坠之地)。目前她正在平面坐标系的原点放牧,打算在群星断其生路前转移至安全地点。

此次共有M (1 ≤ M ≤ 50,000)颗流星来袭,流星i将在时间点Ti (0 ≤ Ti ≤ 1,000) 袭击点 (Xi, Yi) (0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300)。每颗流星都将摧毁落点及其相邻四点的区域。

Bessie在0时刻时处于原点,且只能行于第一象限,以平行与坐标轴每秒一个单位长度的速度奔走于未被毁坏的相邻(通常为4)点上。在某点被摧毁的刹那及其往后的时刻,她都无法进入该点。

寻找Bessie到达安全地点所需的最短时间。

Input - 输入

  • 第1行: 一个整数: M
  • 第2..M+1行: 第i+1行包含由空格分隔的三个整数: Xi, Yi, and Ti

    Output - 输出
  • 仅一行: Bessie寻得安全点所花费的最短时间,无解则为-1。

Sample Input - 输入样例

4

0 0 2

2 1 2

1 1 2

0 3 5

Sample Output - 输出样例

5

AC代码:

include

include

include

include

include

using namespace std;

int a[310][310]; //标记每个点的状态,刚开始初始化后上面的数字代表最早在第几秒该点就已不安全

int M,j,plug=0,d[][2]={{0,1},{0,-1},{1,0},{-1,0},{0,0}}; //在初始化a[][]数组与每次移动的情况这两种情况时使用

struct node {

int x,y,t;

}s[50005];

struct noded {

int x1,y1,len;

};

queuequ;

void init(int x,int y,int m);

int cmp(const node &a,const node &b);

int bfs(){

while(!qu.empty()){

struct noded e=qu.front();

qu.pop();

for(int i=0;i<4;i++){

int nx=e.x1+d[i][0],ny=e.y1+d[i][1];

if(nx<0||ny<0) continue;

if(a[nx][ny]==-1) {

printf("%d\n",e.len+1);

return 0;

}

if(a[nx][ny]>e.len+1) {

a[nx][ny]=e.len+1; //这一步很重要,没有则是超时,有的话时间可以控制在100ms左右,这一步的意义就是走过的不再重复的走

struct noded f;

f.x1=nx,f.y1=ny,f.len=e.len+1;

qu.push(f);

}

	}
}
printf("-1\n");

}

int main(){

cin>>M;

memset(a,-1,sizeof(a)); //初始化为-1,在输入数据之后若仍未-1,则该点为安全点

for(int i=0;i<M;i++){

scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].t);

init(s[i].x,s[i].y,s[i].t); //五个位置不再是绝对安全

}

sort(s,s+M,cmp); //对其进行排序,方便bfs一步一步执行

struct noded e;

e.x1=0,e.y1=0,e.len=0;

qu.push(e);

bfs();

return 0;

}

void init(int x,int y,int m){ //初始化五个点不再绝对安全

for(int i=0;i<5;i++){

int nx=x+d[i][0],ny=y+d[i][1];

if(nx>=0&&ny>=0&&nx<=300&&ny<=300){

if(a[nx][ny]==-1) a[nx][ny]=m;

else a[nx][ny]=min(m,a[nx][ny]);

}

else continue;

}

}

int cmp(const node &a,const node &b){ //sort()比较函数

return a.t<b.t;

}

poj3669 Meteor Shower (宽度优先搜索)的更多相关文章

  1. 挑战程序2.1.5 穷竭搜索>>宽度优先搜索

    先对比一下DFS和BFS         深度优先搜索DFS                                   宽度优先搜索BFS 明显可以看出搜索顺序不同. DFS是搜索单条路径到 ...

  2. poj3669 Meteor Shower(BFS)

    题目链接:poj3669 Meteor Shower 我只想说这题WA了后去看讨论才发现的坑点,除了要注意原点外,流星范围题目给的是[0,300],到302的位置就绝对安全了... #include& ...

  3. 【算法入门】广度/宽度优先搜索(BFS)

    广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较 ...

  4. [宽度优先搜索] FZU-2150 Fire Game

    Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns) ...

  5. 【BFS宽度优先搜索】

    一.求所有顶点到s顶点的最小步数   //BFS宽度优先搜索 #include<iostream> using namespace std; #include<queue> # ...

  6. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...

  7. BFS算法的优化 双向宽度优先搜索

    双向宽度优先搜索 (Bidirectional BFS) 算法适用于如下的场景: 无向图 所有边的长度都为 1 或者长度都一样 同时给出了起点和终点 以上 3 个条件都满足的时候,可以使用双向宽度优先 ...

  8. 宽度优先搜索--------迷宫的最短路径问题(dfs)

    宽度优先搜索运用了队列(queue)在unility头文件中 源代码 #include<iostream>#include<cstdio>#include<queue&g ...

  9. 算法基础⑦搜索与图论--BFS(宽度优先搜索)

    宽度优先搜索(BFS) #include<cstdio> #include<cstring> #include<iostream> #include<algo ...

随机推荐

  1. C# DataTable与实体的相互转换

    using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespac ...

  2. addEventListener 的三个参数

    addEventListener 有三个参数:第一个参数表示事件名称(不含 on,如 "click"):第二个参数表示要接收事件处理的函数:第三个参数为 useCapture,本文 ...

  3. 帝国CMS 调用专题[eshowzt]标签改为灵动标签[e:loop]的方法

    1.eshowzt说明及示例 [eshowzt]标签模板ID,专题类别ID,显示专题数[/eshowzt] 示例需求:将推荐专题后,显示9个指定专题 原来写法: <span>[eshowz ...

  4. centos7.4安装mysql

    yum -y install mysql mysql-server mysql-devel mysql-server报错:No package mysql-server available,另外两个没 ...

  5. python常用模块学习1

    import time time.sleep(1)#暂停时间 time.time()#显示当前系统时间戳 t=time.localtime()#结构化当地时间,可以将结构化时间想象成一个类 print ...

  6. JAVA 关于File的使用

    File中常用方法 创建 createNewFile() 在指定位置创建一个空文件,成功就返回true,如果已存在就不创建然后返回false mkdir() 在指定位置创建目录,这只会创建最后一级目录 ...

  7. selenium 自动化的坑(1)

    UI自动化,一天一坑系列(1) 不要试图自作聪明添加一些不必要的东西. 个人遇到的问题关于下拉框的,本来一个下拉框连续点击两次就好了,结果自己多余将谷歌的提示‘正在受到自动化控制’去掉了,导致原本很简 ...

  8. 【leetcode】307. Range Sum Query - Mutable

    题目如下: 解题思路:就三个字-线段树.这个题目是线段树用法最经典的场景. 代码如下: class NumArray(object): def __init__(self, nums): " ...

  9. jmeter接口测试与接口测试工具

    接口测试与接口测试工具 1,什么是接口? 接口,Application Programming Interface(API) 通俗的讲 就是HTTP请求 2,什么是接口测试? 接口测试测试组件间接口的 ...

  10. 模拟安装redis5.0集群并通过Java代码访问redis集群

    在虚拟机上模拟redis5.0的集群,由于redis的投票机制,一个集群至少需要3个redis节点,如果每个节点设置一主一备,一共需要六台虚拟机来搭建集群,此处,在一台虚拟机上使用6个redis实例来 ...