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) 
  
 
  
      
  
 
  
    运行结果: