利用BFS解决拯救007问题 -- 数据结构
题目:
在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接踩着池子里一系列鳄鱼的大脑袋跳上岸去!(据说当年替身演员被最后一条鳄鱼咬住了脚,幸好穿的是特别加厚的靴子才逃过一劫。)
设鳄鱼池是长宽为100米的方形,中心坐标为 (0, 0),且东北角坐标为 (50, 50)。池心岛是以 (0, 0) 为圆心、直径15米的圆。给定池中分布的鳄鱼的坐标、以及007一次能跳跃的最大距离,你需要告诉他是否有可能逃出生天。
输入格式:
首先第一行给出两个正整数:鳄鱼数量 N(≤100)和007一次能跳跃的最大距离 D。随后 N 行,每行给出一条鳄鱼的 (x,y) 坐标。注意:不会有两条鳄鱼待在同一个点上。
输出格式:
如果007有可能逃脱,就在一行中输出"Yes",否则输出"No"。
输入样例 1:
14 20
25 -15
-25 28
8 49
29 15
-35 -2
5 28
27 -29
-8 -28
-20 -35
-25 -20
-13 29
-30 15
-35 40
12 12
输出样例 1:
Yes
输入样例 2:
4 13
-12 12
12 12
-12 -12
12 -12
输出样例 2:
No
分析:
1. 首先这看上去是一道图的题目,但实际上是不需要将整个图给存储起来也能够完成题目的要求(当然存起来也可以做),
只需要利用好题目所给的坐标就可了!
2. 值得注意的一点是虽然 N(≤100),但如果化为直观图的话,这是一个 101 * 101 的一个矩阵。
3. 拯救007在这里用DFS和BFS都能够解决,这里采用了BFS算法,下面是整道题的思路:
①从池心岛边缘开始,将能够一步到达的坐标(鳄鱼的位置)入队
记作A集合(红点所示)

②A集合中任意选一个点a(队列首元素出队实现)
判断a点能否一步逃离鳄鱼池:
(1)如果可以,输出 Yes 结束程序
(2)如果不可以,从a开始,将能够一步到达的坐标入队,直至A中所有元素遍历完成。
记作B集合(红点所示)

③B集合重复A集合操作。
循环结束条件:(1)找到符合条件的坐标,输出Yes
(2)遍历所有坐标,无符合条件的,输出No
代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std; #define max 101 typedef struct point{
int x, y;//坐标(x,y)
double dis;//点point到圆心(0,0)距离
}point; int visit[max] = {};//全局变量visit[],记录该坐标是否被访问过
void input(point *p, int n);
void BFS(point *p, int n, int step); int main(){
int n, step;
cin>>n>>step; point p[max];
memset(p, , sizeof(p));
input(p, n); //若一步就可以跨出去
if(step >= -7.5){
cout<<"Yes";
}else BFS(p, n, step);//不能一步就跨出去的话 return ;
} //输入函数:输入数据
void input(point *p, int n)
{
for(int i=; i<n; i++){
cin>>p[i].x>>p[i].y;//输入鳄鱼的坐标
p[i].dis = sqrt(p[i].x*p[i].x + p[i].y*p[i].y) - 7.5;//计算并存储鳄鱼到池心岛的最近距离
}
} //层次遍历
void BFS(point *p, int n, int step)
{
//先将第一步能够够得着的坐标入队列
queue<point> qu;
for(int i=; i<n; i++){
if(p[i].dis<=step){
qu.push(p[i]);
visit[i] = ;
}
} while(qu.size() != ){
//判断出队的点A下一步能不能够跨出去
point mark = qu.front();
if(mark.x+step >= || mark.x-step <= - || mark.y+step >= || mark.y-step <=-){
cout<<"Yes";
return;
}
qu.pop(); // A点下一步能够够得着的点入队
for(int i=; i<n; i++){
if(visit[i] != && sqrt((mark.x-p[i].x)*(mark.x-p[i].x) + (mark.y-p[i].y)*(mark.y-p[i].y)) <= step){
qu.push(p[i]);
//入队标记
visit[i] = ;
}
}
} cout<<"No"; }
总结:
拯救007这个题目是一道很好的拓展眼界的题目吧,刚接触这道题的时候会被课本的知识限制住了想象空间,
总觉得做图的题目都要先将图给存储起来,才好做下一步的操作。
还是学的太少,被自己的知识绊住了脚步。
:D 加油!
利用BFS解决拯救007问题 -- 数据结构的更多相关文章
- [LeetCode] BFS解决的题目
一.130 Surrounded Regions(https://leetcode.com/problems/surrounded-regions/description/) 题目: 解法: 这道题 ...
- 有关dfs、bfs解决迷宫问题的个人见解
可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...
- 利用闭包解决for循环里onclick事件不能捕捉实时i值问题
问题描述 我们都知道,如果我们对于一组元素(相同的标签)同时进行onclick事件处理的时候(在需要获取到索引的时候),一般是写一个for循环,但是onclick是一个异步调用的,所以会带来一个问题, ...
- 利用Readability解决网页正文提取问题
分享: 利用Readability解决网页正文提取问题 做数据抓取和分析的各位亲们, 有没有遇到下面的难题呢? - 如何从各式各样的网页中提取正文!? 虽然可以用SS为各种网站写脚本做解析, 但是 ...
- 利用BFS求最短路
利用BFS求图的最短路, POJ3984 #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<string.h& ...
- 利用gulp解决微信浏览器缓存问题
做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问 ...
- 利用Json_encode解决中文问题
利用Json_encode解决中文问题 public function return_json($data=array()){ echo json_encode($data ...
- 利用Filter解决跨域请求的问题
1.为什么出现跨域. 很简单的一句解释,A系统中使用ajax调用B系统中的接口,此时就是一个典型的跨域问题,此时浏览器会出现以下错误信息,此处使用的是chrome浏览器. 错误信息如下: jquery ...
- 利用NSProxy解决NSTimer内存泄漏问题
之前写过一篇利用RunTime解决由NSTimer导致的内存泄漏的文章,最近和同事讨论觉得这样写有点复杂,然后发现有NSProxy这么好用的根类,根类,根类,没错NSProxy与NSObject一样是 ...
随机推荐
- QT5 Even 事件
事件的引入: 实现功能: 1.点击button 文本框两字改变成button被按下;很简单的在button上转到槽对lineEdit->setTest()设置即可; void myWidget: ...
- #415 Div2 Problem C Do you want a data? (math && 前后缀和 && 快速幂)
题意: 首先定义集合的F值为 这个集合里面最大值和最小值的差. 现给出一个拥有n个数的集合(没有相同的元素), 要求求出这个集合内所有子集的F的值的和.例如: {4.7}这个集合里面有子集{4}.{ ...
- javascript中继承方式及优缺点(一)
分别介绍原型链继承.call/apply继承(借用构造函数继承).组合继承.原型式继承.寄生式继承.寄生组合式继承 1. 原型链继承 核心:将父类的实例作为子类的原型 function SuperTy ...
- Confluence 6 多媒体文件和在页面中显示文件列表
多媒体文件 文件的预览同时也支持 MP3 音频和 MP4 视频文件.Confluence 使用 HTML 5 来播放附加的音频和视频文件.这个意味着这些文件类型的文件格式,用户可以在支持的浏览器中直接 ...
- cogs157. [USACO Nov07] 奶牛跨栏 x
157. [USACO Nov07] 奶牛跨栏 ★★ 输入文件:hurdles.in 输出文件:hurdles.out 简单对比时间限制:1 s 内存限制:128 MB 译 by Cm ...
- 翻译一篇英文文章,主要是给自己看的——在ASP.NET Core Web Api中如何刷新token
原文地址 :https://www.blinkingcaret.com/2018/05/30/refresh-tokens-in-asp-net-core-web-api/ 先申明,本人英语太菜,每次 ...
- 分享几个免费IP地址查询接口(API)
淘宝IP地址库 提供的服务包括:1. 根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家.省.市和运营商.2. 用户可以根据自己所在的位置和使用的IP地址更新我们的服 ...
- 用node.js搭建一个静态资源站 html,js,css正确加载 跳转也完美实现!
昨天买了一个服务器想着用来测试一些自己的项目,由于是第一次建站,在tomcat,linux,node.js间想了好久.最终因为node搭建比较方便没那么麻烦就决定用node.js来搭建网站项目. 搭建 ...
- Unity3D_(插件)DOTween动画插件
使用DOTween动画插件来实现物体的移动动画 Learn 一.DOTween插件对变量的动画 二.控制Cube和UI面板的动画 三.动画的快捷播放方式 四.动画的前放和后放 五.From Tween ...
- Nginx配置记录【例2】
B服务器,例: [root@localhost conf.d]# egrep -v "^#|^$" /etc/nginx/nginx.conf user nginx; worker ...