【練習】用python解決小明一家過橋問題


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM