問題:
一群傳教士與野人來到河邊,雙方數量都為 n,小船最大可坐 k人,兩岸及小船上的傳教士數量不能低於野人,否則會被吃掉,問他們如何安全過河?n > k 。
思路及實現:
這道題其實並不難,嚴格意義上來說不屬於演算法題的範疇。主要是考察邏輯的嚴謹性,幾種場景考慮到,然後暴力解就ok了。
直接上**吧:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @date : 2019/3/21 0:41
# @author: joy
# @ide : pycharm
class
missionarycrossriver
:"""
傳教士與野人過河問題:雙方數量都為 n,小船最大可坐 k人,兩岸及小船上的傳教士數量不能低於野人,否則會被吃掉,求如何安全過河
"""def__init__
(self, n:
int, k:
int)
: self.n = n
self.k = k
self.count =
0def
cross_river
(self)
: k = self.k
a = b = self.n
c = d =
0 e = f =
0# 傳教士一次能
p_max = k - k //
2print
(" 岸邊 小船({}) 對岸"
.format
(k))
print
("傳教士 野人 傳教士 野人 傳教士 野人"
)print
("{} {}
.format
(a, b)
)if self.n / k >2:
print
("船太小了,無解..."
)return
print
("開始過河..."
)while a >0:
# 剩下的傳教士恰好可以坐滿小船
if a == k and c ==0:
a -= k
b += d
c = k
d =0 self.move(a, b, c, d, e, f)
break
# 第一次過河,送些野人過去開船
if c ==
0and d ==0:
b -= k -
1 d += k -
1 self.move(a, b, c, d, e, f)
d -= k -
2 f += k -
2 self.move(a, b, c, d, e, f)
if c ==
0and d ==1:
p1 = a - k
p2 = b - k
# 盡量送多點傳教士過河
if p1 <= p_max:
a -= p1
b -= p2
c += p1
d += p2
self.move(a, b, c, d, e, f)
c -= p1
d -= p2
e += p1
f += p2
self.move(a, b, c, d, e, f)
continue
temp = f - e
if temp ==0:
temp =
1 a -= temp
c += temp
self.move(a, b, c, d, e, f)
c -= temp
e += temp
self.move(a, b, c, d, e, f)
# 收尾工作
c -= k
d +=
1 e += k
f -=
1 self.move(a, b, c, d, e, f)
b -= k -
1 d = k
self.move(a, b, c, d, e, f)
d =1 f += k -
1 self.move(a, b, c, d, e, f)
d += b
b =0 self.move(a, b, c, d, e, f)
f += d
d =0print
(a, b,
" "
, c, d,
"->"
, e, f)
print
("回家啦..."
)def
move
(self, a, b, c, d, e, f)
: self.count +=
1if self.count %2==
0:print
(a, b,
", c, d,
" "
, e, f)
else
:print
(a, b,
" "
, c, d,
"->"
, e, f)
if __name__ ==
"__main__"
: missionary = missionarycrossriver(9,
5)missionary.cross_river(
)
結果:
傳教士野人過河問題
這個問題是人工智慧中經典的搜尋問題,下面用深度優先搜尋演算法來解這個題,示例 如下 include include include using namespace std typedef struct mcnode listfringe 相當於佇列 vectorclosed closed表 判斷是否...
野人與傳教士過河問題
題目 設有三個 傳教士和3個野人來到河邊,打算乘乙隻船從右岸渡到左岸去。該船的負載能力為兩個人。在任何時候,如果野人人數超過傳教士人數那麼野人就會把傳教士吃掉。他們怎樣才能用這條船安全地把所有人都渡過河去?河岸 a 對岸 b 船上 2c 2y 1c 1y回去 傳教士划船回去 河岸 a 對岸 b 船上...
傳教士與野人過河問題
360公司 2012年校園招聘會筆試題演算法題 傳教士和野人問題 missionaries and cannibals 這是乙個經常在有關討論人工智慧的書籍中見到的問題,其描述是這樣的 有n個傳教士和n個野人來到河邊渡河,河岸有一條船,每次至多可供k人乘渡。問傳教士為了安全起見,應如何規劃擺渡方案,...