趣味程式設計 過橋問題

2021-10-03 09:13:47 字數 1287 閱讀 3393

過橋問題。有n(n≥2)個人在晚上需要從x地到達y地,中間要過一座橋,過橋需要手電筒(而他們只有1個手電筒),每次最多兩個人一起過橋(否則橋會垮)。n個人的過橋時間依次存入陣列t[n]中,分別為:t[0], t[1], ……, t[n-1]。過橋的速度以慢的人為準!注意:手電筒不能丟過橋!問題是:程式設計求這n個人過橋所花的最短時間。

有多組測試資料,每組資料先輸入乙個人數n,然後輸入這n個人過橋所花的時間。

輸出對應的最短時間。

4 1 2 5 10

4 5 2 10 1

1717

4人過橋問題最佳方案構造法:以下是構造n個人(n≥1)過橋最佳方案的方法:

1、如果n=1、2,所有人直接過橋。

2、如果n=3,由最快的人往返一次把其他兩人送過河(本次過去3個人)。

3、如果n≥4,設zker、cker為走得最快和次快的旅行者,過橋所需時間分別為tzk、tck;而zmer、cmer為走得最慢和次慢的旅行者,過橋所需時間分別為tzm、tcm。那麼

a)當2tck>=tzk+tcm時,使用模式一將zmer和cmer送過橋;(模式一:zker、zmer過去,zker返回送手電,再zker、cmer過去,zker返回送手電,即總是由最快的把2個最慢的送過橋。本模式實際將2個最慢的人送過橋,用時tzm+tzk+tcm+tzk);

b) 當2tck<tzk+tcm時,使用模式二將zmer和cmer送過橋;(模式二:zker、cker過去,zker返回送手電,再zmer、cmer過去,cker返回送手電。本模式實際將2個最慢的人送過橋,用時tck+tzk+tzm+tck)。

這樣就使問題轉變為n-2個旅行者的情形,從而遞迴解決之。編寫遞迴函式解決這個問題最簡單。

此演算法思路來自於:

#include

#include

#include

using

namespace std;

intmove

(vector<

int>

& t,

int n)

else

return

2* t[1]

+ t[0]

+ t[n -1]

+move

(t, n -2)

;}}int

main()

sort

(t.begin()

, t.

end())

; cout <<

move

(t, n)

<< endl;

}}

趣味程式設計 過橋問題(C語言)

過橋問題。有n n 2 個人在晚上需要從x地到達y地,中間要過一座橋,過橋需要手電筒 而他們只有1個手電筒 每次最多兩個人一起過橋 否則橋會垮 n個人的過橋時間依次存入陣列t n 中,分別為 t 0 t 1 t n 1 過橋的速度以慢的人為準!注意 手電筒不能丟過橋!問題是 程式設計求這n個人過橋所...

趣味程式設計 約瑟夫環問題

問題來歷 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報...

微軟過橋問題

u2合唱團在17分鐘內得趕到演唱會場,途中必須跨過一座橋,4個人從橋的同一端出發,我們得幫助他們到達另一端,天色很暗,而他們只有乙隻手電筒。一次同時最多可以有兩人一起過橋,而過橋的時候必須持有手電筒,所以就得有人把手電筒帶來帶去,來回橋兩端。手電筒是不能用丟的方式來傳遞的。4個人的步行速度各不同,若...