这是一个益智题,但如果要从纯粹计算的角度来完成,那么穷举可能是题主想要的结果。
题主的代码实现了随机选择策略,然后直到选出一个满足要求的答案就退出了程序。
如果在题主的代码里修改,主要改进两点。遍历所有可能的过河策略
在遍历过程中避免对重复的策略重新计算
前者可以求出“最快几秒过桥”,后者提高性能。
下面的代码是在问题中原有逻辑上改的,这不是最好的(有点丑),但是可能更直观点。(去除重复策略没有在程序中体现。)
在每个函数里打打当前的 a / b 日志,有助于发现到底有哪些组合。
最后的 result 只记录了可能的过河时间,最快也需要 29 秒。
import itertools
def calcu_from(a, b):
'''
在当前 a / b 情况下,计算从 A -> B 所有可能的过河时间
'''
result = set()
for step in itertools.combinations(a, 2):
m = max(step)
tmp_b = b[:]
tmp_b.extend(step)
next = calcu_to([e for e in a if e not in step], tmp_b)
for n in next:
result.add(n + m)
return result
def calcu_to(a, b):
'''
在当前 a / b 情况下,计算从 B -&g