螞蟻爬桿問題

2021-07-02 01:45:11 字數 1251 閱讀 7082

告訴你有乙個長為l(l<=10000)的木桿,上面有n(n<=1000)個螞蟻,他們一開始的朝向隨機,他們會以一定的速度一直向當前方向走,直到兩隻螞蟻相遇,他們會立即掉頭(即往相反方向走),計算t秒後螞蟻的位置

輸入的第一行為陣列個數,

每組陣列第一行為三個正整數,l,t,n,分別表示長度,時間,螞蟻個數。

l 表示向左,r表示向右

輸出格式為n行,輸出每個螞蟻的位置和朝向,如果t秒內已經掉下,輸出fell off。

樣例輸入:

110   1   4

1  r

5 r3 l

10 r

輸出:case:#1

2  turing

6 r 

2 turing

fell off

分析:首先要知道乙個原則,螞蟻的相對位置不變,比如一開始,在1   4   8 三個位置有甲乙丙三個螞蟻,無論每個螞蟻的位置如何,朝向如何,在不掉下桿的前提下,無論他們怎麼對頭,他們的相對位置都是不變的,甲一定在乙前面,乙一定在丙前面,只是可能距離發生了改變,位置發生了改變,另外乙個原則是,假設在某時刻兩個螞蟻相對而行,而且執行到某一點,這時候他們會掉頭執行,但是其結果,其實和對穿而過是一樣的,所以我們可以按照這個原則來很快確定其最後狀態,比如一開始為1 r   3l,5r,經過兩秒後,可以判斷其最終態一定是3 r,1 l,7r,省略了複雜的分析過程,直接一步到位,只是,位置是3r的,未必是初始位置是1r的。

基於以上兩個原則,我們寫出如下**

#include #include #include using namespace std;

const int max=10000;

typedef struct a

ants;

ants before[max];

ants after[max];

int record[max];

const char information[10]=,,};

//1 代表右轉 -1代表左轉 0代表正在轉身

bool cmp(ants & a,ants & b)

else if(c_status=='r')

after[i].pos=before[i].pos+before[i].status*t;

i++;

} sort(before,before+n,cmp);

sort(after,after+n,cmp);

for(i=0;i10)

cout<<"fell off"<

螞蟻爬桿問題

問題描述 有一根27厘公尺長的細木桿,在第3厘公尺,7厘公尺,11厘公尺,17厘公尺,23厘公尺這五個位置上各有乙隻螞蟻,木桿很細,不能同時通過兩隻螞蟻,開始時,螞蟻的頭朝向左還是右是任意的,他們只會朝前走或掉頭,但不會後退,當兩隻螞蟻相遇後,螞蟻會同時掉頭朝反方向走,假設螞蟻們每秒鐘可以走1厘公尺...

螞蟻爬桿問題分析

題目 讀完這道題以後,我的想法是 最短時間考慮如下 首先標出木桿的中點,即在 0 27 2 13.5厘公尺處。然後所有的螞蟻都沿著木桿向離自己較近的一端走,這樣所有螞蟻都離開木桿的時間是最短的,即,為距離木桿中點最近的螞蟻走向離它最近一端所用的時間。所以此題為11s。0 13.5 27 最長時間考慮...

java螞蟻爬桿

ant private void setmaxtime maxtime maxnearsideposition.divide speed public bigdecimal getmaxtime private void setmintime bigdecimal anotherhalflength...