'''
問題描述:三個野人,三個傳教士,一艘船,船上至多有兩人,在一起的野人數不能超過傳教士,否則傳教士被吃。
狀態=[傳教士數,野人數,船是否在本岸]
動作=[傳教士上船人數,野人上船人數]
變數說明:
*state_route:[[state],[action1],[action2]] 用以描述當前state,是經過怎樣的動作序列得到。
*state_table: [state_route, stateroute...] 未探索的狀態及路徑列表
*searched_table:[state,state...] 已探索的狀態列表
'''def state_transfer(state_route, action):
route = state_route.copy()
state = route[0]
new_state = [0, 0, 0]
if state[2] == 1:
if state[0] < action[0] or state[1] < action[1]:
return false
else:
new_state[0] = state[0]-action[0]
new_state[1] = state[1]-action[1]
new_state[2] = 1-state[2]
else:
if 3-state[0] < action[0] or 3-state[1] < action[1]:
return false
else:
new_state[0] = state[0]+action[0]
new_state[1] = state[1]+action[1]
new_state[2] = 1-state[2]
if new_state[0] < new_state[1] and new_state[0] != 0:
return false
if 3-new_state[0] < 3-new_state[1] and 3-new_state[0] != 0:
return false
route[0] = new_state
return route
def main():
state_table =
state_route =
target = [0,0,0]
state_init = [3, 3, 1]
searched_table =
action = [[0,1],[1,0],[0,2],[2,0],[1,1]]
while state_table != :
if state_table[0][0] not in searched_table:
for i in range(5):
state_route = state_transfer(state_table[0], action[i])
if state_route is false:
continue
if state_route[0] == target:
print(state_route)
break
state_table.pop(0)
if __name__ == "__main__":
main()
野人與傳教士過河問題
題目 設有三個 傳教士和3個野人來到河邊,打算乘乙隻船從右岸渡到左岸去。該船的負載能力為兩個人。在任何時候,如果野人人數超過傳教士人數那麼野人就會把傳教士吃掉。他們怎樣才能用這條船安全地把所有人都渡過河去?河岸 a 對岸 b 船上 2c 2y 1c 1y回去 傳教士划船回去 河岸 a 對岸 b 船上...
傳教士與野人過河問題
360公司 2012年校園招聘會筆試題演算法題 傳教士和野人問題 missionaries and cannibals 這是乙個經常在有關討論人工智慧的書籍中見到的問題,其描述是這樣的 有n個傳教士和n個野人來到河邊渡河,河岸有一條船,每次至多可供k人乘渡。問傳教士為了安全起見,應如何規劃擺渡方案,...
傳教士與野人過河問題
360公司 2012年校園招聘會筆試題演算法題 傳教士和野人問題 missionaries and cannibals 這是乙個經常在有關討論人工智慧的書籍中見到的問題,其描述是這樣的 有n個傳教士和n個野人來到河邊渡河,河岸有一條船,每次至多可供k人乘渡。問傳教士為了安全起見,應如何規劃擺渡方案,...