在 Python 中寻找到达家的最小跳跃的程序
假设有一个名为forbidden的数组,其中forbidden[i]表示bug不能跳转到forbidden[i]的位置,我们也有a、b、x三个值。虫子的家在数轴上的x位置。它最初位于位置0。它可以按照以下规则跳转-
错误可以准确地向右跳一个位置。
Bug可以准确地向左跳b个位置。
Bug不能连续两次向后跳。
Bug不能跳转到数组中给定的任何禁止位置。
Bug可以向前跳出它的家,但它不能跳到以负值编号的位置。
我们必须找到bug到达目的地所需的最少跳跃次数。如果没有这种可能的序列,则返回-1。
因此,如果输入类似于forbidden=[2,3,7,9,12],a=4,b=2,x=16,那么输出将为7,因为从0开始,向前跳跃a=4两次到达4和8,但不能跳到12,因为这是禁止的,然后在6处后退b=2,然后跳到10、14、18,然后两次返回到16,所以有7步。
示例
让我们看看以下实现以获得更好的理解-
def solve(forbidden, a, b, x): queue, forbidden = [(x,0,True)], set(forbidden) lim = max(max(forbidden),x)+a+b while queue: curr,jumps,is_b = queue.pop(0) if curr in forbidden or not 0 <= curr <= lim: continue forbidden.add(curr) if curr==0: return jumps if is_b: queue.append((curr+b,jumps+1,False)) queue.append((curr-a,jumps+1,True)) return -1 forbidden = [2,3,7,9, 12] a = 4 b = 2 x = 16 print(solve(forbidden, a, b, x))
输入
[2,3,7,9, 12], 4, 2, 16输出结果
7