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

2021-10-21 14:25:05 字數 1800 閱讀 3867

過橋問題。有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

#include

#include

void

paixun

(int time,

int n)

;//氣泡排序對時間排序

intguoqiao

(int time,

int n)

;//當2*t次快>=t最快+t次慢時,t最慢+t最快+t次慢+t最快//當2*tck<tzk+tcm時,tck+tzk+tzm+tck

intmain()

paixun

(time,n);if

(n==1)

printf

("%d\n"

,time[0]

);if(n==2)

else

if(n==3)

else

if(n>=4)

}return0;

}void

paixun

(int time,

int n)}}

}int

guoqiao

(int time,

int n)

if(n==2)

if(n==3)

if(2*time[1]

>=time[0]

+time[n]

)else

return sum;

}

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

如果n=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)。

演算法步驟:

1)從鍵盤輸入乙個數賦值給n表示為n個人;

2)再從鍵盤輸入這些人過橋所需時間;

3)對n個人所需時間進行排序;

4)如果只有兩個人則輸入時間較長的那個時間;

5)如果有三人則輸出三人時間和;

6)如果大於等於4人用遞迴函式求出時間並輸出時間;

遞迴條件沒注意陣列從0開始;

解決辦法:n-1;

趣味程式設計 過橋問題

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

趣味C語言

一 詞法陷阱 1.int a 021 則a的值是多少?021被編譯器認為是八進位制 2.z b p 與z b p的區別 前者 被看成乙個標示符 二 語法陷阱 1.運算子的優先順序問題 依次降低 1 陣列下標 函式呼叫 操作各結構成員選擇操作符 和.結合方式 從左到右 2 單目操作符 結合方式 從右到...

趣味C語言

1.演示多個字元從兩端移動,向中間匯聚。include includeint main system pause return 0 2.模擬使用者登入情景,並且只能登入三次。只允許登入三次,如果密碼正確則提示登入成功,如果三次均輸入錯誤,則退出程式。include include includein...