题目:获取一个正整数数组的最优跳动方式,要求如下:
1)从数组中间的任意位置开始向右跳,每次跳动的步伐数不能超过该位置对应元素的值
2)在跳动次数最少的情况下计算每次跳动的步伐
#定义一个树节点,普通的树
class ptree():
def __init__(self,index,lst = []):
self.index = index #树的节点值 ,此处为列表的元素的下标
#孩子列表,ptree对象列表,列表对象一定要深度拷贝
self.child_lst = copy.deepcopy(lst)
import copy
#为nodei节点 添加孩子,nodei代表节点在列表中的小标位置,为其添加孩子列表
def addchildfornodei(nodei,lst):
length = len(lst)
#如果从此节点直接 跳到最右测,那么它的孩子只有一个:lst的最后一个元素
if length - 1 -nodei.index <=lst[nodei.index]:
child = ptree(length - 1)
nodei.child_lst.append(child)
return
#否则,一次跳不完,那么根据其值,添加所有可能的孩子
else:
for cc in range(1,lst[nodei.index]+1):
child = ptree(nodei.index+cc)
nodei.child_lst.append(child)
#循环嵌套,为孩子节点,再次添加孩子
addchildfornodei(nodei.child_lst[len(nodei.child_lst)-1],lst)
return
#创建一个树,普通的树,从当前元素,所有可能的路,到达终点
def creattree(lst,i):
length = len(lst)
if length >3 and 0< i < length -1:
pass
else:
return None
#生成跟节点,为其增加孩子节点
root = ptree(i)
addchildfornodei(root,lst)
return root
import copy
#
def addlst(node,lst_path):
if len(node.child_lst) ==0:
return
j_path_pos = 0###
#循环获得,当前跟节点,所在的路径,以便继续完善
for i in range(len(lst_path)):
if node.index == lst_path[i][len(lst_path[i])-1]:
j_path_pos = i
break
#保存当前路径副本,并从元列表中删除
j_path = lst_path.pop(j_path_pos)
#循环将孩子节点加入路径中
for i in range(len(node.child_lst)):
tmp_path = copy.deepcopy( j_path)
tmp_path.append(node.child_lst[i].index)
lst_path.append(tmp_path)
#嵌套对每个孩子,仅需添加路径
for i in range(len(node.child_lst)):
addlst(node.child_lst[i],lst_path)
#遍历树root,获得所有根到叶子的路径
def getlst(root):
lst_result = [[root.index]]
#嵌套循环,为当前节点获取路径
addlst(root,lst_result)
return lst_result
def fuuu():
lst = [2,3,4,1,5,2,6,1,7,3,4,1,5]
root = creattree(lst,2)
ll = getlst(root)
#对所有路径排序,最短的为最快的
sorted(ll,key = lambda x :len(x))
short = len(ll[0])
for i in ll:
if short == len(i):
print(i)
else:
break
fuuu()