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

675.砍伐高尔夫比赛的树木:“ BFS”和“ Astar算法”和“检查预处理”

时间:2023-03-06 13:02:11 网络应用技术

  这是Leetcode上的675。很难为高尔夫游戏砍伐树木。

  标签:“图形BFS”,“ Astar算法”,“启发搜索”,“分类”

  邀请您剪下一棵树来进行高尔夫游戏。在此矩阵中,树林由$ m imes n $的矩阵代表:

  每个步骤,您都可以沿向上,向下,左和向右的一个方向移动一个单元。如果您站着的树,则可以决定是否将其切下。

  您需要在树高度将所有树木从低到高切下来,每次切成树时,单元的值都会变成$ 1 $(也就是说,转向地面)。

  您将从$(0,0)$开始工作,并在切割所有树木后返回您需要采取的最小步骤。如果您无法完成所有树木,则返回$ -1 $。

  可以保证,没有两棵树的高度是相同的,您至少需要砍伐一棵树。

  示例1:

  示例2:

  示例3:

  暗示:

  基本问题是:给定一个$ n imes m $的矩阵,每次您都可以将单元移至当前位置的“四个Unicom”,$ 0 $的位置为障碍(无法访问),并且位置$ 1 $的价格代表平坦的土地(您可以直接访问,不需要做出任何决定)。其余的位置大于$ 1 $代表树。当您通过位置时,您可以考虑切割树(相应的值变为平面$ 1 $)。

  同时,我们只能按照“低到高”的顺序砍伐树木的主题限制,并且图片中没有高度等于两棵树只有确定,即,对于所有有树的地方,所有Treesthe“高度”行订单都是完整的树切割路线。

  另一个更重要的性质是:点和点之间的最短路径,不会随着树木切割过程的开发而改变(砍伐树点,它只会变得平坦,它不会变成平坦的地面,并且会变成平坦的地面不会成为它。可以通过的点)。

  总而言之,切割树切割的唯一方法是每个相邻树切地点的最短路径,积累是答案(整个树切割路径的最小步骤)。

  因此,结合仅$ 50 $的数据范围,点之间的边界电源为$ 1 $(一个步骤是一步),我们可以直接解决它。

  首先遍历整个图片,预处理所有树(以三元组$(高度,x,y)$的形式),并在$高度$中的序列以获得唯一确定的确定性树路。

  之后,计算了树的道路直径中相邻点的最短距离,并使用了这两个点的最短路径的复杂性来求解两个点的两个点。它是$ o(n^)2 * imes m^2)$。

  相邻点的最短部分也是整个算法的复杂性。数据范围仅为$ 50 $,计算金额不超过$ 10^7 $。

  代码:

  因为问题的本质是找到最短的电路,与此同时,原始问题的边界力量为$ 1 $,因此应用具有高复杂性比率的最短道路算法对这个问题不是有意义的,但是利用灵感来搜索astar算法来优化它是它的重要意义。

  因为在此过程中,我们将朝着“四个Unicom”的方向搜索,直到找到“当前树的下一个目标位置”为止。实际上,这两个点之间的最短路径通常在两个点和两个点之间。相关的位置。

  让我做吗?目前,我们处于位置$ s $,我们的目标位置为$ t $,$ t $在$ s $的底部。“右下角”达到$ t $,并且我们考虑搜索其他一般方向的路径:

  如何设计这样的优先搜索顺序是ASTAR算法“启发性函数”的设计过程,该过程实质上是对“最小步骤数”的估计。“实际最小步骤”,保证Astar算法的正确性。

  因此,我们经常将“理论最小步骤”用作灵感函数。对于此问题,您可以将“曼哈顿距离”直接用作“理论最低数字”。

  因此,如果我们想从源$ s $到交换点$ t $,而当前位于中点$ x $,则是$ x $估计的最小步骤数:点$ x $数字+从点$ x $到点$ t $(曼哈顿距离)的理论最小步骤(曼哈顿距离)。根据“总最小步骤估计”和ASTAR算法的搜索顺序,使用“优先战”可以实现。

  ASTAR算法已经完成了多次,可以在这里看到相关的收藏。此外,许多不了解互联网上Astar的正确性的人将缺乏以下判断逻辑。简而言之,灵感功能的设计是用于交换点的,因此Astar算法的搜索过程仅确保$ t $的顺序可以对应于$ t $ k $ hart Circuit,而对于该点的其余部分,对于其余部分,则无需与该点其余部分的入口和退出团队的最短电路通信。因此,当更新一定点的最小步骤时,我们将再次进入团队。

  代码:

  我们知道,Astar算法使用“优先起重机(堆)”来获得灵感,并且是最佳路径方向的相反位置(例如,$ t $在$ s $的权利,但由于混乱,那里是障碍物,但存在障碍。最短的道路需要在左侧到$ t $)。由于优先队列(堆),Astar将具有额外的$ log $复杂性。

  因此,可行的优化是我们首先处理“无解决方案”的情况。普遍的做法是在预处理过程中使用“和检查”来维持连接性。

  这有助于计算大量无效搜索(最终无解决方案),这些搜索不会影响未来的复杂性。

  代码:

  这是我们“通过Leetcode”系列的第一篇文章。该系列始于2021/01/01。从开始开始时的起始代码开始,总共有1916年的问题。该主题已经完成。

  在这一系列文章中,除了解释问题 - 解决想法之外,还将尽可能多地提供最简洁的代码。如果涉及通信,将有相应的代码模板。

  为了使学生更容易在计算机上调试和提交代码,我建立了一个相关的仓库:https://github.com/sharingsource/logicstack-letcode。

  在仓库地址中,您可以看到一系列文章的解释链接,一系列文章的相应代码,leetcode的原始链接以及其他首选解决方案。

  原始:https://juejin.cn/post/7100806168771035149