在河的左岸有N個傳教士、N個野人和一條船,傳教士們想用這條船把所有人都運過河去,但有以下條件限制:
(1)修道士和野人都會劃船,但船每次最多隻能運M個人;
(2)在任何岸邊以及船上,野人數目都不能超過修道士,否則修道士會被野人吃掉。
假定野人會服從任何一種過河安排,請規劃出一個確定修道士安全過河的計劃。
百度一下,網上全是用左岸的傳教士和野人人數以及船的位置這樣一個三元組作為狀态,進行考慮,千篇一律。
我換了一種考慮,隻考慮船的狀态。
船的狀态:(x, y) x表示船上x個傳教士,y表示船上y個野人,其中 |x|∈[0, m], |y|∈[0, m], 0<|x|+|y|<=m, x*y>=0, |x|>=|y|
船從左到右時,x,y取非負數。船從右到左時,x,y取非正數
解的編碼:[(x0,y0), (x1,y1), ..., (xp,yp)] 其中x0+x1+...+xp=N, y0+y1+...+yp=N
解的長度不固定,但一定為奇數
開始時左岸(N, N), 右岸(0, 0)。最終時左岸(0, 0), 右岸(N, N)
由于船的合法狀态是動态的、二維的。是以,使用一個函數<code>get_states()</code>來專門生成其狀态空間,使得主程式更加清晰。

解的解釋,從上往下看:
貌似隻有滿足<code>m = n-1</code>,此問題才有解。