題目:
小明一家過一座橋,過橋時是黑夜,所以必須有燈。現在小明過橋要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)
運行結果:
