傳教士與野人過河問題(Python3解法)

2021-09-13 02:23:53 字數 2843 閱讀 5609

問題:

一群傳教士與野人來到河邊,雙方數量都為 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人乘渡。問傳教士為了安全起見,應如何規劃擺渡方案,...