这道题看起来好像还是挺难的,毕竟文字就已经挺多的了。但我现在做出来了,我也可以假装一波了:其实吧,这道题也不是很难。认真想一想也还是可以做出来的。(那个在图书馆搞了3个钟的人不是我)哈哈。
好了,言归正传,我们一起来看看这道题吧。为了让下面的分析比较清晰明了,这里我先放张题目的图片吧。
前面的情节带入都不关键的东西知道是要拯救007就可以了,后面的以坐标式的输入则让我找到了存储的结构。很明显,找到跳脱的路线,不也是可以理解为在地图里面找到正确的路线吗。再加上我们这一章我们学的就是图。基本数据结构就是图了。接下来就是图里面包括的东西了。我选取的还是邻接矩阵的方法,毕竟比较熟悉嘛。然而有一点要改变的就是顶点集实际上是要存取这个点的坐标。(根据输入分析可以知道啦)所以我就将顶点集类型定义为了node型,node中含有两个变量分别为横坐标和纵坐标。
解决完存储结构,接下来就要正式开始解决问题了。
首先,我们需要构建一张地图。只有有了这一张图我们才能找到路径,是吧。事实上也就是我们平常的找到点,构建边的过程。有所不同的是之前都是在输入里面给了数据来构建边,现在则是要自己构建了。因此我们就要利用题目的条件来找到能相连的两个点,并构建这条边。
- 要将所有的点存储进入图中,这个还是比较简单的一个循环就可以了,毕竟题目中也给了点的数目(鳄鱼的数量)。但是这里要注意的是,我们还需要自己给出起点。个人觉得这里的处理还是比较重要的。我在这就选择了采用原点作为起点,后面会具体解释为什么的,且给出这样做的合理性的。
- 接下来该构建边了,还是和之前一开始的操作一致。我们需要先把二维矩阵全部初始化为零。保守起见我用了双重循环赋了值。接下来就是连边了。
①首先,我们先处理一般的情况,(相连的两个点不包括起点及原点的情况)我们首先需要进行一个判断,这两个点能不能相连。判断的条件自然就是这两点的距离007究竟能不能跨越。一开始我用了两点之间的距离公式,开了个方,发现真的很麻烦。因为sqrt只对常量有用,转念一想,距离的平方比较也一样可以啊。还不用担心小数点后面的数值的影响。也是一举两得了。于是我写了一个函数来判断两点能否连接。这里采用了双重循环的方法,把每个点都尝试与另一个点建立边,判断成功就把两点相连,并把原来二维矩阵的值改为他们的距离的平方值。
②我们要解决特殊情况了,及起点与别的点相连的情况了。这也就是我为什么要把原点作为起点的原因了。这样子的话,我们的起点就是唯一的,到另外一个点的距离也可以是确定的了。只是在构建边的时候改变一下判断条件就可以了。这时,要把007当做在原点起跳的话,就只要把它能跳跃的距离多增加圆岛半径的长就可以了。
- 最后一步了,找到路线,成功或者不成功进行一个判断。一开始我的想法是在最后一个点时判断是否能到达安全地。可是我想了很久,始终觉得要找到离岸边最近的点要进行的判断可能有点多。于是我就转化了想法,我们可以假设每一个点都有可能到达安全区,即访问每个点的时候都进行一次判断,当符合条件的时候,就把判断的变量check赋值为1。这里只需遍历每一个点进行判断就可以了。具体是广搜或者深搜其实都没太大问题。反正我是用广搜了,毕竟迭代还是挺好想的。
在这里呢我觉得比较关键的地方就是如何判断当前点是否能到达安全区了。这里我觉得我还是有些小机智的。毕竟点到直线的距离最短就是垂直距离了。这时候只需要判断横坐标以及纵坐标的情况就可以了。如果当前点离边界的水平距离或者竖直距离小于007所能跨越的最大距离就可以认为该点是可以到达安全区的。这里,会有坐标正负号不统一的情况,那就全部统一吧。就不用分情况了。直接全部转化为正数,再求距离判断就可以啦。
好了,到这里问题也差不多解决了啦。但是其实我做完之后还是找bug找了很久,在构建的时候漏了&号,导致图没构建成功。也是找了挺久才发现的。这个还是很需要注意的啊。
上次的目标完成得还不错,我下次的目标是好好回顾一下这学期前面学习的内容。巩固一下基础。
原文地址:https://www.cnblogs.com/ilikezero/p/10884431.html