死或活龟跳算法

时间:2013-09-12 09:21:16

标签: algorithm

河流分为n段广度,石头或水[1,0,0,1,1,0,1,1,0,1 ...]。一侧有一只乌龟。银行和他可以以x的速度移动,x速度意味着他可以一次穿越河流的x段。 在以x速度进行交叉之后,他可以获得这三种速度中的任何一种,x,x + 1,x-1。 他可以向两个方向移动。

现在1代表石头,0代表水。 如果乌龟跳入水中他会死,但如果他在石头上跳跃,那么他可以根据给定的规则获得新的速度。

没有。段(n),段的分布(array [n])和初始速度(x)。 发现乌龟是否有可能将它送到银行的另一边?

我已经递归地解决了这个问题,但是无法使用非递归方法。

一边是龟|| 1,0,1,1,0,0,0,1,1,0,1,.... ||河的另一边

1 个答案:

答案 0 :(得分:3)

基本上这是一个简单的搜索问题,你的状态是乌龟当前位置的元组和它的速度。它可以在没有使用堆栈(深度优先)或队列(广度优先搜索)的递归的情况下实现。这是在Python中使用队列(即广度优先)的实现:

from collections import deque

def cross_river(river, position=0, speed=1):
    queue = deque([(position, speed, [])])
    visited = set()
    while queue:
        position, speed, path = queue.popleft()

        # if  last stone of river, return sequence of jumps to get there
        if position == len(river) - 1:
            return path

        # check whether we've been here before
        if (position, abs(speed)) in visited:
            continue
        visited.add((position, abs(speed)))

        # for all possible jumps, add the new state to the queue
        for i in [-1, 0, +1]:    # change in speed
            for k in [-1, +1]:   # change in direction
                new_spd = (speed + i) * k
                new_pos = position + new_spd
                if 0 <= new_pos < len(river) and river[new_pos] == 1:
                    queue.append((new_pos, new_spd, path + [new_spd]))

print cross_river([1,0,1,1,0,0,0,1,1,0,1])  # Result: [2, -2, 3, 4, 3]

(事实上,这个算法比你问题中描述的要严格得多,因为乌龟必须在最后一块石头上完全 ,而不是在另一边的任何地方,但是这个应该很容易改变。)