小明一家过桥_「小明一家人过桥问题」如何用编程解决?

这是一个益智题,但如果要从纯粹计算的角度来完成,那么穷举可能是题主想要的结果。

题主的代码实现了随机选择策略,然后直到选出一个满足要求的答案就退出了程序。

如果在题主的代码里修改,主要改进两点。遍历所有可能的过河策略

在遍历过程中避免对重复的策略重新计算

前者可以求出“最快几秒过桥”,后者提高性能。

下面的代码是在问题中原有逻辑上改的,这不是最好的(有点丑),但是可能更直观点。(去除重复策略没有在程序中体现。)

在每个函数里打打当前的 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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值