|
发表于 2015-3-15 22:13:10
|
显示全部楼层
回帖奖励 +10 鱼币
本帖最后由 lightninng 于 2015-3-15 22:30 编辑
话说。楼上的朋友想的真是全面。自己都没想过还有多种路径的情况。不过考虑一下还挺有意思的。按照wei_Y同学的代码改编了一个搜索所有路径的函数,返回值为[最大收集数,[路径列表]]- def dug(dia):
- path_dic = {0:'L',1:'M',2:'R'}
- #自底向上更新每个结点的值为由此结点向下可以挖到的最多钻石数
- for i in reversed(range(len(dia)-1)):
- # 底层开始取值
- for j in range(len(dia[i])):
- max_list = [dia[i+1][j], dia[i+1][j+1], dia[i+1][j+2]]
- max_dia = max(max_list)
- # 取最大值。
- dia[i][j] = dia[i][j] + max_dia
- result = [dia[0][0],[]]#存放最后结果
- #参照二叉树遍历思想用一个栈来存放可能收集到最多钻石的路径
- stack = [("",0,0)] #根结点入栈,栈中的元素为:由上层挖到该结点所经过的路径、结点的位置组成的三元组
- while stack != []:
- node = stack.pop()
- if node[1] == (len(dia) - 1):
- result[1].append(node[0]) #如果是最底层结点则将路径输出
- continue
- max_list = [dia[node[1]+1][node[2]], dia[node[1]+1][node[2]+1], dia[node[1]+1][node[2]+2]]
- max_next = max(max_list)
- #将下一层可以收集到最多钻石的结点入栈
- if max_list[0] == max_next:
- stack.append((node[0]+'L',node[1]+1,node[2]))
- if max_list[1] == max_next:
- stack.append((node[0]+'M',node[1]+1,node[2]+1))
- if max_list[2] == max_next:
- stack.append((node[0]+'R',node[1]+1,node[2]+2))
- return result
复制代码
测试结果为- [8, ['']]
- [5, ['R']]
- [23, ['LL']]
- [24, ['LMR']]
- [38, ['RRRR']]
- [41, ['MRLRM', 'MRLRL']]
- [49, ['RLMLRL', 'RLLMRL']]
- [49, ['MRMMMLM']]
- [71, ['MMLMRRLL']]
- [66, ['MMLLRRLRR']]
- [78, ['MMRLRRMRLR', 'MMRLRRMMMR']]
- [83, ['LLRLLLRMRRL', 'LLRLLLRMRLL', 'LLRLLLRMLRL', 'LLRLLLRMLLR']]
复制代码
|
|