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

find the path with least number of jumps for a frog crossing pond using divide and conquer

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

我们得到了一个包含 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:青蛙从数组前一个单位开始,必须到达数组后一个单位(有可能没有条件的路径)

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

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

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 次跳跃)。

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