記錄一下幾個月前寫的傳教士過河問題,網上稱為mc問題。
在河的左岸有N個傳教士、N個野人和一條船,傳教士們想用這條船把所有人都運過河去,但有以下條件限制:
(1)傳教士和野人都會划船,但船每次最多只能運K個人;
(2)在任何岸邊野人數目都不能超過傳教士,否則傳教士會被野人吃掉。假定野人會服從任何一種過河安排,請規划出一個確保傳教士安全過河的計划。
那么首先定義狀態節點,這個節點里包含了包含了左岸傳教士、野人、船的狀態。如下:
接下來就是主體算法:
DFS函數的輸入s就是初始狀態,如(3,3,1)表示左岸3個傳教士、3個野人和船在左岸。然后就是遍歷各種情況,排除非法情況,完善狀態節點和OPEN、CLOSED兩個表,不斷進行迭代,直到滿足結束狀態即(0,0,0)。然后就是把父節點一路打印出來就是解。
完整代碼如下: