小明一家过桥_【练习】用python解决小明一家过桥问题
import random
list1=[] #存放所有遍歷的結(jié)果
#等待過(guò)橋的人員
bridge1={'小明':1,'弟弟':3,'爸爸':6,'媽媽':8,'爺爺':12}
#過(guò)橋后的人員
bridge2={}
#判斷未過(guò)橋的人是否空了(全部過(guò)完后,程序停止,看總共用了多長(zhǎng)時(shí)間)
len1=len(bridge1)
print(len1)
#while True:
print('初始情況:當(dāng)前未過(guò)橋的人是:',end=' ')
print(bridge1)
print('初始情況:當(dāng)前已過(guò)橋的人是:', end=' ')
print(bridge2)
print('*********************************')
#一次while,就完成一次一家人完整的過(guò)河流程;一次fow,就完成一次過(guò)河和回來(lái)的過(guò)程(2個(gè)人過(guò)河,一個(gè)人回來(lái))
while True:
for i in range(1,10):
print('第%d次過(guò)橋和回來(lái)的過(guò)程如下:' % i)
#隨機(jī)從未過(guò)橋的人員中取一個(gè)人出來(lái)(key),取出來(lái)是一個(gè)字符串型的數(shù)據(jù)
p1=random.choice(list(bridge1))
print(p1+'準(zhǔn)備過(guò)橋')
#print(type(p1))
#取出后,將這個(gè)人對(duì)應(yīng)的過(guò)橋時(shí)間取出來(lái)(value),取出來(lái)是一個(gè)整數(shù)型的數(shù)據(jù)
print(p1+'的時(shí)間為'+str(bridge1[p1]))
#print(type(bridge1[p1]))
time1=bridge1[p1] #將第一個(gè)人的所用時(shí)間存起來(lái),用于后面比較取大值
#取出第一個(gè)人后,把這個(gè)人賦值給已過(guò)河的人,并且從未過(guò)河的人群中刪除
bridge2[p1]=bridge1[p1]
del bridge1[p1]
print(bridge1)
#print('準(zhǔn)備過(guò)橋:', end=' ')
#print(bridge2)
#同理,再?gòu)奈催^(guò)橋的人隨機(jī)取一個(gè)人和對(duì)應(yīng)的時(shí)間。此時(shí)發(fā)現(xiàn)一個(gè)問(wèn)題,有可能和前一次取的人一樣,所以前面應(yīng)該取一次,刪一次。
p2=random.choice(list(bridge1))
print(p2+'準(zhǔn)備過(guò)橋', end=' ')
#print(type(p2))
#print(bridge1[p2])
#print(type(bridge1[p2]))
time2=bridge1[p2] #將第二個(gè)人的所用時(shí)間存起來(lái),用于后面比較取大值
print(p2+'的時(shí)間為:'+str(bridge1[p2]))
#取出第二個(gè)人后,把這個(gè)人賦值給已過(guò)河的人,并且從未過(guò)河的人群中刪除
bridge2[p2]=bridge1[p2]
del bridge1[p2]
print(bridge1)
print('已過(guò)橋:', end=' ')
print(bridge2)
#求上面兩個(gè)值的最大值
time3=max(time1, time2)
print('過(guò)橋時(shí)間為:'+str(time3))
total_time=total_time+time3
#再將總時(shí)間減去第一次過(guò)河的最長(zhǎng)時(shí)間
#left_time=30-time3
print('當(dāng)前未過(guò)橋的人是:',end=' ')
print(bridge1)
print('當(dāng)前已過(guò)橋:', end=' ')
print(bridge2)
#如果都過(guò)完河了,就沒(méi)必要再返回啦!所以終止!
if len(bridge1)==0:
print('最終總時(shí)長(zhǎng)為:%d' % total_time)
break
#print('當(dāng)前剩余時(shí)間為:%d' % left_time)
#再?gòu)囊堰^(guò)橋的人中選一個(gè)時(shí)間最短的人回來(lái),再把這個(gè)人的所用時(shí)間取出來(lái),再把這個(gè)人從已過(guò)橋的人中搬回未過(guò)橋的人中
p3=min(bridge2, key=bridge2.get)
#p3=random.choice(list(bridge2))
time4=bridge2[p3]
print(p3+'回來(lái)', end=' ')
#print(bridge2[p3])
print(p3+'的時(shí)間為:'+str(bridge2[p3]))
bridge1[p3]=bridge2[p3]
del bridge2[p3]
len1=len(bridge1)
print('當(dāng)前已過(guò)橋:', end=' ')
print(bridge2)
print('當(dāng)前未過(guò)橋:', end=' ')
print(bridge1)
total_time = total_time+time4
print('當(dāng)前總花費(fèi)時(shí)間:%d' % total_time)
##記錄下這一輪完整過(guò)橋的時(shí)間
list1.append(total_time)
#print(list1)
if total_time<=30:
break
#執(zhí)行完一輪之后,重新恢復(fù)初始狀態(tài),再跑一輪
bridge1={'小明':1,'弟弟':3,'爸爸':6,'媽媽':8,'爺爺':12}
bridge2={}
total_time=0
list1.sort()
print(list1)
運(yùn)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的小明一家过桥_【练习】用python解决小明一家过桥问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python示例apk_Python获取
- 下一篇: python读取python源代码文件_