河流分为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,.... ||河的另一边
答案 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]
(事实上,这个算法比你问题中描述的要严格得多,因为乌龟必须在最后一块石头上完全 ,而不是在另一边的任何地方,但是这个应该很容易改变。)