問題:有一根27厘公尺的細木桿,在第3厘公尺、7厘公尺、11厘公尺、17厘公尺、23厘公尺這五個位置上各有乙隻螞蟻。木桿很細,不能同時通過兩隻螞蟻。開始時,螞蟻頭朝向任意(左或右),它們只會朝前或掉頭,不會後退。當任意兩隻螞蟻碰頭是,兩隻螞蟻會同時調頭朝反向走。假設螞蟻每秒走1厘公尺,編寫程式,求所有螞蟻都離開木桿的最短時間和最長時間。
解法一:
蠻力解法(brute force),列舉各螞蟻的初始朝向,模擬每個螞蟻的運動規律來解決。
解法二:
細心分析一下螞蟻的運動及其行走的路徑,可以得出一些有用的資訊,例如兩隻螞蟻a、b運動如下圖所示:
a與b相遇,然後反向前進,最後a與b都離開了木桿,a總共走了6,b總共走了4。
若a與b相遇時,不是反向前進而是擦肩而過,繼續前進,a走了5,b也走了5。
可以看出將「掉頭走」看作「擦肩而過」,這樣螞蟻的運動就是獨立的,其實a代替了b走,b代替了a走。
這樣所有的螞蟻運動軌跡可能與原來不同,但不影響所有螞蟻離開木桿的最短時間和最長時間。
實現:
#include usingnamespace
std;
void calctime(double polelen,double *xpos,int antnum,double speed,double &tmin,double &tmax)
else
curmin = polelen -curmax;
if (tmax
if (tmin < curmin) //
注意這裡是小於因為是所有螞蟻最短時間,取最短中最大的
}tmax/=speed;
tmin/=speed;
}void
main()
;
double speed=1
;
double
timemax,timemin;
calctime(polelength,ants,
5,speed,timemin,timemax);
cout
<
maxtime:
"cout
<
mintime"}
maxtime:24擴充套件問題:1.第i只螞蟻,什麼時候走出木桿?2.所有螞蟻從一開始到全部離開木桿共碰撞了多少次?mintime11
請按任意鍵繼續. . .
《程式設計之美》螞蟻爬桿問題的擴充套件
程式設計之美 4.7節描述了螞蟻爬桿問題,把所有具體數字都表示成字母後變為形如如下形式的問題 有一根長為l 的平行於x軸的細木桿,其左端點的x座標為0 故右端點的x座標為l 剛開始時,上面有n 只螞蟻,第i 1 i n 只螞蟻的橫座標為x 假設x 已經按照遞增順序排列 方向為d 0表示向左,1表示向...
java螞蟻爬桿
ant private void setmaxtime maxtime maxnearsideposition.divide speed public bigdecimal getmaxtime private void setmintime bigdecimal anotherhalflength...
螞蟻爬桿問題
問題描述 有一根27厘公尺長的細木桿,在第3厘公尺,7厘公尺,11厘公尺,17厘公尺,23厘公尺這五個位置上各有乙隻螞蟻,木桿很細,不能同時通過兩隻螞蟻,開始時,螞蟻的頭朝向左還是右是任意的,他們只會朝前走或掉頭,但不會後退,當兩隻螞蟻相遇後,螞蟻會同時掉頭朝反方向走,假設螞蟻們每秒鐘可以走1厘公尺...