使用分而治之法找到青蛙穿越池塘跳跃次数最少的路径

Posted

技术标签:

【中文标题】使用分而治之法找到青蛙穿越池塘跳跃次数最少的路径【英文标题】:find the path with least number of jumps for a frog crossing pond using divide and conquer 【发布时间】:2021-06-09 21:43:09 【问题描述】:

一只青蛙试图穿过池塘,但他只能在石头上跳跃,最多可以跳五个单位。

我们得到了一个包含 1 和 0 的数组(0 代表水,1 代表石头)以及寻找最佳方法以找到跳跃次数最少的路径的任务(如果可能,使用分而治之)。

数组示例 -> [0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0] p.s:青蛙从数组前一个单元开始,必须到达数组后一个单元(可能是没有可用的路径,上面提到的条件)

我刚刚开始学习算法,如果你们能帮助我学习算法和代码,那就太好了。

【问题讨论】:

问题陈述中似乎缺少某些内容。青蛙需要做的就是跳得越远越好。换句话说,解决方案是一个简单的 O(n) 贪心算法。 @user3386109 我知道贪心算法,但你能提出一个分而治之的解决方案 似乎任何分而治之的方法都只会模仿贪婪的方法,但速度较慢且记账更多。您是否有任何理由需要针对这个特定问题的 D&D 算法? @ADdV 问题是在 D&D 会议中提出的,所以我认为通过 D&D 解决方案更好地解决可能是有意义的 @ADdV tnx 很多 【参考方案1】:

我对分而治之方法的想法如下:

program frog(array)
begin
  divide array after the '1' left of the center of the array;
  foreach (partialArray) do begin
    if (length(partialArray) > 5) then frog(partialArray);
  end foreach;
end.

让我们以您给定的数组为例:[0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0]

1st 师:[0 0 0 1 0 0 1 0 0 1|0 1 0 0 1 0 1 1 0 0 0 0] 2nd师:[0 0 0 1|0 0 1 0 0 1|0 1 0 0 1|0 1 1 0 0 0 0] 3rd 师:[0 0 0 1|0 0 1|0 0 1|0 1 0 0 1|0 1 1|0 0 0 0]

在这种情况下,青蛙会在到达目标之前跳到第一个、第二个、第三个、第五个和第七个1(= 6 次跳跃)。

为什么这个算法有效?假设,它不会为青蛙输出最短的跳跃方式。这意味着,我们没有找到青蛙跳跃最大的partialArrays。如果一个partialArray 不像最大的跳跃,那将意味着:在partialArray 内的1 之后至少有一个1,青蛙仍然可以到达。这是不可能的,因为length(partialArray) ≤ 5 成立。因此,partialArray 之后的每一个1 都会离得太远(> 5)。

【讨论】:

以上是关于使用分而治之法找到青蛙穿越池塘跳跃次数最少的路径的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1061 青蛙的约会(欧几里得扩展)

跳跃游戏 II

pku_oj: w11-03讨厌的青蛙(C++枚举算法)

更好的青蛙穿越算法

POJ-2253 Frogger---最短路变形&&最大边的最小值

聪明的青蛙