程式設計之美 4 7螞蟻爬桿

2022-06-28 14:30:17 字數 1405 閱讀 6387

問題:有一根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 using

namespace

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

mintime11

請按任意鍵繼續. . .

擴充套件問題:1.第i只螞蟻,什麼時候走出木桿?2.所有螞蟻從一開始到全部離開木桿共碰撞了多少次?

《程式設計之美》螞蟻爬桿問題的擴充套件

程式設計之美 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厘公尺...