首页 > 编程语言 > 详细

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

时间:2019-08-27 15:14:31      阅读:268      评论:0      收藏:0      [点我收藏+]

题目:
小明一家过一座桥,过桥时是黑夜,所以必须有灯。现在小明过桥要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)
 
运行结果:
技术分享图片

 

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

原文:https://www.cnblogs.com/reinhard314/p/11418092.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!