[编程题1][牛客]袋鼠过河问题

题目描述原题链接

一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米,如果为0,就会陷进去无法继续跳跃。河流一共N米宽,袋鼠初始位置就在第一个弹簧上面,要跳到最后一个弹簧之后就算过河了,给定每个弹簧的力量,求袋鼠最少需要多少跳能够到达对岸。如果无法到达输出-1

基本思路:

从起始位置出发,每到一个位置,根据它的弹簧能力,e.g. space 来遍历下一步可能到达的所有位置,并判断当前跳跃方式是否为到达该位置的最短路径,类似为维特比译码。

源代码@Python

 1 N = input()
 2 x = map(int, raw_input().split())
 3 
 4 step = [float("Inf") for i in range(0,N+1)]# to record step before this
 5 step[0] = 0 #the initial pos
 6 
 7 for i in range(0,N):
 8 #    if x[i]==0:
 9 #        continue
10     for iSpace in range(1,x[i]+1):
11         if i+iSpace<=N:
12             step[i+iSpace] = min(1+step[i],step[i+iSpace])
13 if step[N]==float("Inf"):
14     print str(-1)
15 else:
16     print str(step[N])

 

注:

  • stepy用于存储到达每个位置所需的最小步数。这里初始化为无穷大,便于每次比较取最小值,但输出时需要加判断;也可以初始化为-1,这样每次更新时需要判断是否第一次到达该位置。
  • step的长度比弹簧个数多一个,最后一个表示目的地(河对岸)。这样,如果能到达,直接输出目的地对应的step数,且同时避免了不是从最后一个弹簧跳到河对岸的情况;
  • 可加判断【line 8-9】跳过无跳跃能力的弹簧

posted on 2017-08-17 15:11  小鱼吐泡泡  阅读(376)  评论(0编辑  收藏  举报

导航