题目
思路
思路一
一句话题意:你要从最低点走到最高点,你必须从与下边界联通的洞孔开始走,而且每次只能走到和你所在奶酪相连通的奶酪.
对于两个奶酪而言,他们的距离必须小于2×r,才被认为是相通的.
空间内两点P1(x1,y1,z1)、P2(x2,y2,z2)的距离公式如下:
条件
这道题目的条件就是:连通性&两点之间距离公式.
这道题目的性质:还是上面所说的连通性.即两个奶酪必须连通,才可以转移
算法选择: 这道题目我们初步一看,发现特别的繁琐,然而实际上这道题目就是一道平面直角坐标系走迷宫问题.
对于走迷宫问题,显然BFS广度优先搜索是我们的不二选择.
解析算法
首先对于一道搜索题目而言的话,我们还是有基本的三点目标
目标一:方向指示数组: 对于这道题目而言,显然每一个和它相连通的洞都可以,所以这道题目的方向指示数组形同虚设.
目标二:边界处理: 对于这道题目而言,我们的坐标其实也没有什么要求,因为连通已经包含了所有的条件.
目标三:拓展准则: 每一道搜索题目,难点往往都在这个拓展准则上面,这道题目也不例外,我们发现,这道题目的拓展准则也就是题目中连通性,只要两个点是连通的,那么我们就可以拓展.
思路二
显而易见,这题和并查集有关
大家看看上面这张图,是不是看出一些门道了?我们把所有空洞划分为若干个集合,一旦两个空洞相交或相切,就把它们放到同一个集合中。
我们还可以划出2个特殊元素,分别表示底部和顶部,如果一个空洞与底部接触,则把它与表示底部的元素放在同一个集合中,顶部同理。最后,只需要看顶部和底部是不是在同一个集合中即可。这完全可以通过并查集实现。
思路一代码
思路二代码