【傳教士和食人者問題】
在河的左岸有3個傳教士、1條船和3個食人者,傳教士們想用這條船將所有的成員運到河的右岸,但是受到以下條件的限制:
(1)船每次最多只能裝2個乘客(傳教士和食人者都會划船);
(2)在任何岸邊,如果食人者數目超過傳教士則傳教士將被食人者吃掉。
(3)假定食人者會服從任何一種過河安排。
只輸出乙個解,但是輸出乙個解後會繼續執行,如果想要得到全部解,需要稍加修改輸出部分,本**使用迭代法,深度優先策略。
m,n,k=3,
3,2list1=[(
3,3,
1)]def
lefttoright
(lm,lc,lb)
:for i in
range(0
,lm+1)
:for j in
range(0
,lc+1)
:if i+j<=k and
(lm-i>=lc-j or lm-i==0)
and(m-lm+i>=n-lc+j or m-lm+i==0)
and(lm-i,lc-j,0)
notin list1 and i+j>
0and
(i==
0or i>
0and j<=i)
:#判斷是否滿足過河條件
print
("有"
, i,
"個人"
, j,
"個野人從左岸到右岸"
)(lm-i,lc-j,0)
)print
("左岸狀態:"
,list1[
len(list1)-1
])righttoleft(m-lm+i,n-lc+j,0)
if i==lm+
1and(0
,0,0
)not
in list1:
print
("無解決方案"
)def
righttoleft
(rm,rc,lb)
:if rm==m and rc==n:
print
(list1)
else
:for i in
range(0
,rm+1)
:for j in
range(0
,rc+1)
:if i+j<= k and
(rm-i>=rc-j or rm-i==0)
and(m-rm + i>=n-rc+j or m-rm+i==0)
and(m-rm+i,m-rc+j,1)
notin list1 and i+j>
0and
(i==
0or i>
0and j<=i)
:print
("有"
,i,"個人"
,j,"個野人從右岸到左岸"
)(m-rm + i, m-rc+j,1)
)print
("左岸狀態:"
, list1[
len(list1)-1
])lefttoright(m-rm+i,n-rc+j,1)
print
("從列表中刪除狀態:"
,list1[
len(list1)-1
],,list1[
len(list1)-2
])list1.pop(
)#刪除沒有接下來沒有解決方案的上一條方案
defmain()
: lefttoright(m,n,1)
if __name__==
"__main__"
: main(
)
結果
*有 0 個人 1 個野人從左岸到右岸
左岸狀態: (3, 2, 0)
從列表中刪除狀態: (3, 2, 0) 恢復到上乙個狀態: (3, 3, 1)
有 0 個人 2 個野人從左岸到右岸
左岸狀態: (3, 1, 0)
有 0 個人 1 個野人從右岸到左岸
左岸狀態: (3, 2, 1)
有 0 個人 2 個野人從左岸到右岸
左岸狀態: (3, 0, 0)
有 0 個人 1 個野人從右岸到左岸
左岸狀態: (3, 1, 1)
有 2 個人 0 個野人從左岸到右岸
左岸狀態: (1, 1, 0)
有 1 個人 1 個野人從右岸到左岸
左岸狀態: (2, 2, 1)
有 2 個人 0 個野人從左岸到右岸
左岸狀態: (0, 2, 0)
有 0 個人 1 個野人從右岸到左岸
左岸狀態: (0, 3, 1)
有 0 個人 2 個野人從左岸到右岸
左岸狀態: (0, 1, 0)
有 0 個人 1 個野人從右岸到左岸
左岸狀態: (0, 2, 1)
有 0 個人 2 個野人從左岸到右岸
左岸狀態: (0, 0, 0)
[(3, 3, 1), (3, 1, 0), (3, 2, 1), (3, 0, 0), (3, 1, 1), (1, 1, 0), (2, 2, 1), (0, 2, 0), (0, 3, 1), (0, 1, 0), (0, 2, 1), (0, 0, 0)]
有 1 個人 0 個野人從右岸到左岸
左岸狀態: (1, 1, 1)
從列表中刪除狀態: (1, 1, 1) 恢復到上乙個狀態: (0, 0, 0)
從列表中刪除狀態: (0, 0, 0) 恢復到上乙個狀態: (0, 2, 1)
從列表中刪除狀態: (0, 2, 1) 恢復到上乙個狀態: (0, 1, 0)
從列表中刪除狀態: (0, 1, 0) 恢復到上乙個狀態: (0, 3, 1)
有 1 個人 0 個野人從左岸到右岸
左岸狀態: (2, 2, 0)
從列表中刪除狀態: (2, 2, 0) 恢復到上乙個狀態: (0, 3, 1)
從列表中刪除狀態: (0, 3, 1) 恢復到上乙個狀態: (0, 2, 0)
有 1 個人 1 個野人從左岸到右岸
左岸狀態: (2, 2, 0)
從列表中刪除狀態: (2, 2, 0) 恢復到上乙個狀態: (0, 2, 0)
*
傳教士與野人過河問題 人工智慧實驗報告
理解並熟悉掌握深度優先搜尋演算法。將所學人工智慧理論知識綜合運用到具體專案當中。有 n 個傳教士和 n 個野人來到河邊渡河,河岸有一條船,每次至多可供 k 人乘渡。問 傳教士為了安全起見,應如何規劃擺渡方案,使得任何時刻,河兩岸以及船上的野人數目總是不超過傳教士的數目 否則不安全,傳教士有可能被野人...
演算法 傳教士和野人問題
有n個傳教士和n個野人來到河邊準備渡河,河岸有一條船,每次至多可供k人乘渡。問傳教士為了安全起見,應如何規劃擺渡方案,使得任何時刻,在河的兩岸以及船上的野人數目總是不超過傳教士的數目。即求解傳教士和野人從左岸全部擺渡到右岸的過程中,任何時刻滿足m 傳教士數 c 野人數 和m c k 的擺渡方案。te...
360面試題 傳教士和野人過河問題。
程式設計題 傳教士人數m,野人c,m c,開始都在岸左邊,船隻能載兩人,傳教士和野人都會划船,當然必須有人划船 兩岸邊保證野人人數不能大於傳教士人數 把所有人都送過河,設計一方案,要求程式設計實現。思路 深度搜尋。狀態 左岸和右岸的人數 船的位置。每乙個狀態下,會有5種狀態可以轉移,即 1,運送2個...