1. 程式人生 > >商人過河問題的Python實現

商人過河問題的Python實現

# -*- coding: cp936 -*-
#定義允許存在的狀態集合
def allowexistset():
    merchants=int(raw_input("請輸入商人數: "))
    slivers=int(raw_input("請輸入隨從數: "))
    allowset=[]
    for i in range(merchants+1):
        for j in range(slivers+1):
            #商人數為0
            if i==0:
                allowset.append([i,j])
            #全部商人在一起
            elif i==merchants:
                allowset.append([i,j])
            #一岸商人數大於等於隨從數,並且要保證另一岸商人數大於等於隨從數
            elif i>=j and ((merchants-i)>=(slivers-j)):
                allowset.append([i,j])
                #print allowset
    return allowset,merchants,slivers
"""
執行返回結果:
>>> allowexistset()
請輸入商人數: 3
請輸入隨從數: 3
[[0, 0], [0, 1], [0, 2], [0, 3], [1, 1], [2, 2], [3, 0], [3, 1], [3, 2], [3, 3]]
"""

#定義允許行動集合
def allowmoveset(merchants,slivers):
    boat_num=int(raw_input("請輸入船的最大承載人數: "))
    allowacset=[]
    for i in range(merchants+1):
        for j in range(slivers+1):
            if (i+j)<=boat_num:
                allowacset.append([i,j])
    allowacset.pop(0)
    return allowacset
"""
執行返回結果:
>>> allowset,merchants,slivers=allowexistset()
請輸入商人數: 3
請輸入隨從數: 3
>>> allowactionset(merchants,slivers)
請輸入船的最大承載人數: 2
[[0, 1], [0, 2], [1, 0], [1, 1], [2, 0]]
"""

#開始行動啦
def move(merchants,slivers):
        k=1#設定初始移動次數
        current=[merchants,slivers]#設定此岸初始狀態
        current1=[0,0]#設定對岸初始狀態
        #首先從所有的allowacset 裡面隨機選取一個行動方案進行執行
        import random
        move=random.choice(allowacset)
        #將move集合列表的兩個元素拆分為商人數和隨從數
        #測試一下行動後是否處於安全狀態,這裡先假設一個
        trys=[current[0]+((-1)**k)*move[0],current[1]+((-1)**k)*move[1]]
        #如果執行了行動後的狀態屬於allowset,則更新current
        print "第" ,k ,"次行動:"
        while current!=[0,0] and current1!=[3,3]:
            if trys in allowset:
                current[0]=current[0]+((-1)**k)*move[0]
                current[1]=current[1]+((-1)**k)*move[1]
                current1[0]=current[1]-((-1)**k)*move[0]
                current1[1]=current[1]-((-1)**k)*move[1]
                
                if k %2 ==1:
                    print [move[0],move[1]],"到對岸"
                    print current

                else:
                    print [move[0],move[1]],"返回本岸"
                    print current
            else:
                continue
       
            k+=1