当前位置: 首页 > 网络应用技术

[LeetCode14例程] 2.深优先搜索网格问题单一文章

时间:2023-03-07 11:40:47 网络应用技术

  通常,DFS用于树木和图片中,但网格的遍历可以视为树的延伸。二进制树的每个节点都有两个左和右节点,并且网格周围有4个网格。

  岛屿问题是一个典型的网格问题。每个网格中的数字可能为0或1。我们将数字0作为海上网格,将网格作为海上网格,而网格则以1号为土地网格,以便相邻的土地网格连接到一个岛上。

  在这样的环境下,已经出现了各种岛屿问题的变体,包括该岛的数量,面积和周边。但是,这些问题基本上可以用DFS解决。

  DFS的基本结构

  网格结构比二进制树结构更为复杂。它实际上是图形结构的简化版本。要在网格上编写DFS遍历,我们必须首先了解二进制树上的DFS遍历方法,然后类似于网格结构上的DFS遍历。我们写的二进制树DFS通常是这样:

  可以看出,二进制树的DFS具有两个元素:“与相邻节点的访问”和“ Base Base Case”。

  第一个元素是访问相邻节点。二进制树的相邻节点非常简单,只有左节点和右节点。二进制树本身是递归定义的结构:二进制树,其左下角和右树也是一棵二进制树。那么我们的DFS遍历只需要递归地调用左右树即可。

  第二个要素是判断基本案例。从总体上讲,由二进制树穿过的基本案例是root == null。有两个含义,例如这种情况:一方面,这表明子树是由根是空的,不再需要穿越它。另一方面,当root == null返回时,它可以允许以后的root.Lot。

  对于网格上的DFS,我们可以参考二进制树的DF,并写入网格DFS的两个元素:

  首先,网格结构中有多少个相邻节点?答案是四个上,向下,向下,左和右。1),(r,c+1)。换句话说,网格结构是“四个叉子”。

  其次,网格dfs中的基本情况是什么?与二进制树的基本情况相对应,应该是网格不需要继续穿越。网格[r] [c]将出现出价边界异常的晶格阵列,这是超过网格范围的网格。

  通过这种方式,我们获得了由电网DFS穿越的框架代码:

  如何避免重复遍历

  网格结构的DFS和DFS之间的最大差异是,在遍历期间可能会遇到已遍历的节点。这是因为网格结构本质上是“图片”。我们可以将每个网格视为图中的节点,每个节点都有四个向上,向下,左和右的边缘。在图片上,自然可以遇到重复的遍历节点。

  如何避免这种重复的遍历?答案是旅行的标签。以岛屿的问题为例,我们需要在所有土地网格上进行DFS遍历,价值为1。当何时走路时,价值网格的设置为0,因此当我们遇到0时,您可以直接跳过:

  通过这种方式,我们得到了岛屿问题甚至各种网格问题的常见DFS遍历方法。下面提到的以下示例只需要在DFS遍历框架上稍作修改即可。

  提示:标记“旅行的陆地格子”为0,与海网相同,名称为“降落方法”,即,陆上网格被遍历以使陆地“下沉”进入海洋。似乎非常聪明,但实际上存在很大的隐藏危险,因为我们无法区分“海上网格”和“旅行的土地网格”。如果主题更加复杂,我们每次都可以将网格的价值更改为2穿过陆地网格,这样当我们遇到2时,我们知道这是遍历轨道,0是海上网格。

  解决方案:实际上有很多方法来寻求岛屿的周边。如果您总是要求DFS,那么有一个非常简单的想法:对于土地网格的每一侧,当边界是网格的边界或另一个相邻的网格的边界是水域。方向是边界或水域。如果是这样,请将此边缘(即1)的贡献添加到答案中。我们可以绘制图片以更清楚地查看:

  解决方案的想法:这也是深度遍历。在遍历过程中,将计算出的网格设置为0,以防止重复计算在下面积累。

  在解决问题的问题下:在对主题的解释中注意到,在任何边界上都不会填充o作为X。因此,我们会认为应该专门处理边界上的o。只要它在边界的边界上进行专门处理,其余的O被X替换为X。问题已转换,如何与边框Unicom找到O,找到O,我们将其连接到边界,我们将替换首先,然后穿过整个网格,将剩余的O更换为X

  如何找到连接到边界的O:从顶部和底部,左右,右侧和右侧的网格进行深度穿越,并找到与边界的连接。

  给定M X n的非负整数矩阵,以表示每个牢房在大陆上的高度。“太平洋”在大陆的左侧和上部边界,“大西洋”在右侧和下边界。大陆。规定水流只能沿顶部,向下,左和右的方向流动,并且只能从高到低或相同的高度流动。请找出水流的坐标“大西洋”上的“太平洋”和“大西洋”

  解决方案的想法:对于可以在两侧流动的海洋,然后两侧的水都可以达到这一点,与上述问题的想法相似。我们从四个边界的点开始,以 - 深度优先级搜索,水已经开始向后流动,逻辑需要逆转,因此只有下一个点大于当前点或等于当前点或等于当前点,水流可以。//类似于上述问题代码