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