商人過河問題的Python實現
阿新 • • 發佈:2018-11-02
# -*- 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