00拯救007

这道题看起来好像还是挺难的,毕竟文字就已经挺多的了。但我现在做出来了,我也可以假装一波了:其实吧,这道题也不是很难。认真想一想也还是可以做出来的。(那个在图书馆搞了3个钟的人不是我)哈哈。

好了,言归正传,我们一起来看看这道题吧。为了让下面的分析比较清晰明了,这里我先放张题目的图片吧。

前面的情节带入都不关键的东西知道是要拯救007就可以了,后面的以坐标式的输入则让我找到了存储的结构。很明显,找到跳脱的路线,不也是可以理解为在地图里面找到正确的路线吗。再加上我们这一章我们学的就是图。基本数据结构就是图了。接下来就是图里面包括的东西了。我选取的还是邻接矩阵的方法,毕竟比较熟悉嘛。然而有一点要改变的就是顶点集实际上是要存取这个点的坐标。(根据输入分析可以知道啦)所以我就将顶点集类型定义为了node型,node中含有两个变量分别为横坐标和纵坐标。

解决完存储结构,接下来就要正式开始解决问题了。

首先,我们需要构建一张地图。只有有了这一张图我们才能找到路径,是吧。事实上也就是我们平常的找到点,构建边的过程。有所不同的是之前都是在输入里面给了数据来构建边,现在则是要自己构建了。因此我们就要利用题目的条件来找到能相连的两个点,并构建这条边。

  1. 要将所有的点存储进入图中,这个还是比较简单的一个循环就可以了,毕竟题目中也给了点的数目(鳄鱼的数量)。但是这里要注意的是,我们还需要自己给出起点。个人觉得这里的处理还是比较重要的。我在这就选择了采用原点作为起点,后面会具体解释为什么的,且给出这样做的合理性的。
  2. 接下来该构建边了,还是和之前一开始的操作一致。我们需要先把二维矩阵全部初始化为零。保守起见我用了双重循环赋了值。接下来就是连边了。

①首先,我们先处理一般的情况,(相连的两个点不包括起点及原点的情况)我们首先需要进行一个判断,这两个点能不能相连。判断的条件自然就是这两点的距离007究竟能不能跨越。一开始我用了两点之间的距离公式,开了个方,发现真的很麻烦。因为sqrt只对常量有用,转念一想,距离的平方比较也一样可以啊。还不用担心小数点后面的数值的影响。也是一举两得了。于是我写了一个函数来判断两点能否连接。这里采用了双重循环的方法,把每个点都尝试与另一个点建立边,判断成功就把两点相连,并把原来二维矩阵的值改为他们的距离的平方值。

②我们要解决特殊情况了,及起点与别的点相连的情况了。这也就是我为什么要把原点作为起点的原因了。这样子的话,我们的起点就是唯一的,到另外一个点的距离也可以是确定的了。只是在构建边的时候改变一下判断条件就可以了。这时,要把007当做在原点起跳的话,就只要把它能跳跃的距离多增加圆岛半径的长就可以了。

  1. 最后一步了,找到路线,成功或者不成功进行一个判断。一开始我的想法是在最后一个点时判断是否能到达安全地。可是我想了很久,始终觉得要找到离岸边最近的点要进行的判断可能有点多。于是我就转化了想法,我们可以假设每一个点都有可能到达安全区,即访问每个点的时候都进行一次判断,当符合条件的时候,就把判断的变量check赋值为1。这里只需遍历每一个点进行判断就可以了。具体是广搜或者深搜其实都没太大问题。反正我是用广搜了,毕竟迭代还是挺好想的。

在这里呢我觉得比较关键的地方就是如何判断当前点是否能到达安全区了。这里我觉得我还是有些小机智的。毕竟点到直线的距离最短就是垂直距离了。这时候只需要判断横坐标以及纵坐标的情况就可以了。如果当前点离边界的水平距离或者竖直距离小于007所能跨越的最大距离就可以认为该点是可以到达安全区的。这里,会有坐标正负号不统一的情况,那就全部统一吧。就不用分情况了。直接全部转化为正数,再求距离判断就可以啦。

好了,到这里问题也差不多解决了啦。但是其实我做完之后还是找bug找了很久,在构建的时候漏了&号,导致图没构建成功。也是找了挺久才发现的。这个还是很需要注意的啊。

上次的目标完成得还不错,我下次的目标是好好回顾一下这学期前面学习的内容。巩固一下基础。

原文地址:https://www.cnblogs.com/ilikezero/p/10884431.html

时间: 2024-10-01 00:28:39

00拯救007的相关文章

数据结构--图(上)--应用实例:拯救007+六度空间

应用实例:拯救007 总体算法 应用实例:六度空间

图的基本概念,图的遍历、拯救007

图(graph):表示"多对多"的关系六度空间理论(Six Degrees Separation)包含:1.一组顶点:通常用V(Vertex)表示顶点集合2.一组边:通常用E(edge)表示边的集合 边是顶点对:(v, w) 属于E, v , w 属于V 有向边<v, w>表示v 指向w的边(单行线) 不考虑重边和自回路 抽象数据类型定义:1.类型名称:图2.数据对象集:G(V, E)由一个非空的有限顶点集合v 和一个有限边集合Ezucheng 2.操作集: 常见术语:有向

进阶实验6-3.4 拯救007(升级版) (30分)-BFS

解题思路: 1.先按第一跳距离升序 2.合法第一跳加入队列中 3.(广度优先)访问队列中的结点,每访问一个结点并将其可到达的子孙加入队列中,直至访问至某个结点可以到岸结束 #include <stdio.h> #include <string.h> #include <math.h> #define MaxV 100+5 #define INF 0x3f3f3f3f typedef struct { int x,y; double firstjump; } GNode;

2019天梯赛第三次训练赛

7-1 求整数均值 (10 分) 本题要求编写程序,计算4个整数的和与平均值.题目保证输入与输出均在整型范围内. 输入格式: 输入在一行中给出4个整数,其间以空格分隔. 输出格式: 在一行中按照格式"Sum = 和; Average = 平均值"顺序输出和与平均值,其中平均值精确到小数点后一位. 输入样例: 1 2 3 4 输出样例: Sum = 10; Average = 2.5 水题 1 #include<bits/stdc++.h> 2 using namespace

大数(bzoj 4542)

/* 想了半天莫队,不知道咋转移,需要动下脑子. 有一个很显然的结论是如果(l,r)是P的倍数,那么s[l...n]%P=s[r+1...n]%P. 根据这个东西,我们预处理出所有的后缀%P的余数,接下里就是查询区间内相同得数对数量,就很好转移了. 有一点,当P=2或5时,不否和上面的情况,需单独讨论. */ #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #

BZOJ4542 [HNOI2016] 大数

[问题描述] 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345 .小B还有一个素数P.现在,小 B 提出了 M 个询问,每个询问求 S 的一个子串中有多少子串是 P 的倍数(0 也 是P 的倍数).例如 S为0077时,其子串 007有6个子串:0,0,7,00,07,007:显然0077的子串007有6个子串都是素 数7的倍数. [输入格式] 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数

bzoj4542 大数

Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个询问求 S 的一个子串中有多少子串是 P 的倍数(0 也是P 的倍数).例如 S为0077时,其子串 007有6个子串:0,0,7,00,07,007:显然0077的子串007有6个子串都是素数7的倍数. Input 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数

cisco ap 1200 升级IOS或恢复

cisco ap 1200 升级IOS 首先打开cisco tftp工具,然后连接console线,重启进入 :模式, ap: ?看是否支持set命令,一般都支持然后如下配置,和router 上类似配置ip 地址ap: set IP_ADDR 1.1.1.1     (配置ap本地地址)ap: set NETMASK 255.255.255.0ap: set DEFAULT_ROUTER 1.1.1.2 (tftp address)ap: tftp_initap: BOOT=tftp://1.1

bzoj4542【HNOI2016】大数

4542: [Hnoi2016]大数 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 801  Solved: 282 [Submit][Status][Discuss] Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345 .小B还有一个素数P.现在,小 B 提出了 M 个询问,每个询问求 S 的一个子串中有多少子串是 P 的倍数(0 也 是P 的倍数).例