Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 806|回复: 0

【练习】用python解决小明一家过桥问题

[复制链接]
  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 803 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726482
    发表于 2021-8-27 11:27:54 | 显示全部楼层 |阅读模式

    题目:
    小明一家过一座桥,过桥时是黑夜,所以必须有灯。现在小明过桥要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的妈妈要8秒,小明的爷爷要12秒。每次此桥最多可过两人,而过桥的速度依过桥最慢者而定,而且灯在点燃后30秒就会熄灭。问:小明一家如何过桥?

    比较白痴的代码如下,可以算出一种过桥方案:

    (贴在博客里没有缩进,所以实际执行的时候请注意一下……)

    import random
     
    list1=[] #存放所有遍历的结果

    #等待过桥的人员
    bridge1={'小明':1,'弟弟':3,'爸爸':6,'妈妈':8,'爷爷':12}

    #过桥后的人员
    bridge2={}

    #判断未过桥的人是否空了(全部过完后,程序停止,看总共用了多长时间)
    len1=len(bridge1)
    print(len1)

    #while True:

    print('初始情况:当前未过桥的人是:',end=' ')
    print(bridge1)

    print('初始情况:当前已过桥的人是:', end=' ')
    print(bridge2)
    print('*********************************')

    #一次while,就完成一次一家人完整的过河流程;一次fow,就完成一次过河和回来的过程(2个人过河,一个人回来)
    while True:

    for i in range(1,10):

    print('第%d次过桥和回来的过程如下:' % i)

    #随机从未过桥的人员中取一个人出来(key),取出来是一个字符串型的数据
    p1=random.choice(list(bridge1))
    print(p1+'准备过桥')
    #print(type(p1))

    #取出后,将这个人对应的过桥时间取出来(value),取出来是一个整数型的数据
    print(p1+'的时间为'+str(bridge1[p1]))
    #print(type(bridge1[p1]))
    time1=bridge1[p1] #将第一个人的所用时间存起来,用于后面比较取大值

    #取出第一个人后,把这个人赋值给已过河的人,并且从未过河的人群中删除
    bridge2[p1]=bridge1[p1]
    del bridge1[p1]
    print(bridge1)
    #print('准备过桥:', end=' ')
    #print(bridge2)

    #同理,再从未过桥的人随机取一个人和对应的时间。此时发现一个问题,有可能和前一次取的人一样,所以前面应该取一次,删一次。
    p2=random.choice(list(bridge1))
    print(p2+'准备过桥', end=' ')
    #print(type(p2))

    #print(bridge1[p2])
    #print(type(bridge1[p2]))
    time2=bridge1[p2] #将第二个人的所用时间存起来,用于后面比较取大值
    print(p2+'的时间为:'+str(bridge1[p2]))

    #取出第二个人后,把这个人赋值给已过河的人,并且从未过河的人群中删除
    bridge2[p2]=bridge1[p2]
    del bridge1[p2]
    print(bridge1)
    print('已过桥:', end=' ')
    print(bridge2)

    #求上面两个值的最大值
    time3=max(time1, time2)
    print('过桥时间为:'+str(time3))

    total_time=total_time+time3


    #再将总时间减去第一次过河的最长时间
    #left_time=30-time3

    print('当前未过桥的人是:',end=' ')
    print(bridge1)

    print('当前已过桥:', end=' ')
    print(bridge2)
     
    #如果都过完河了,就没必要再返回啦!所以终止!
    if len(bridge1)==0:
    print('最终总时长为:%d' % total_time)
    break

    #print('当前剩余时间为:%d' % left_time)

    #再从已过桥的人中选一个时间最短的人回来,再把这个人的所用时间取出来,再把这个人从已过桥的人中搬回未过桥的人中
    p3=min(bridge2, key=bridge2.get)
    #p3=random.choice(list(bridge2))
    time4=bridge2[p3]
    print(p3+'回来', end=' ')
    #print(bridge2[p3])
    print(p3+'的时间为:'+str(bridge2[p3]))
    bridge1[p3]=bridge2[p3]
    del bridge2[p3]

    len1=len(bridge1)

    print('当前已过桥:', end=' ')
    print(bridge2)
    print('当前未过桥:', end=' ')
    print(bridge1)
    total_time = total_time+time4
    print('当前总花费时间:%d' % total_time)

    ##记录下这一轮完整过桥的时间
    list1.append(total_time)
    #print(list1)

    if total_time<=30:
    break

    #执行完一轮之后,重新恢复初始状态,再跑一轮
    bridge1={'小明':1,'弟弟':3,'爸爸':6,'妈妈':8,'爷爷':12}
    bridge2={}
    total_time=0
     
    list1.sort()
    print(list1)
     
    运行结果:

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-24 05:14 , Processed in 1.186893 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表