古代有一位書生李公子,奇愛吟詩作賦。一天,他獨自坐在院中小酌時,忽見椿樹下的一群螞蟻正在忙於搬運著食物。李公子浮想聯翩:假若有一隻螞蟻感冒了,且會傳染給碰到它的其他螞蟻,那麼在寬度只能容身一隻螞蟻的獨木橋上,當他們把食物搬運完後會有多少隻螞蟻感冒呢?
李公子現在很困惑,沉思許久,他始終想不明白這個問題,於是通過時光穿梭手機打電話給你,讓你通過編程技術來解答這個問題。
我想此刻你的大腦一定飛速運轉起來了,你可以先獨立思考,且可以用任意編程語言編碼驗證。如若沒有思路,沒關係,請跟著我來一起分析。
問題梳理
長100釐米的獨木橋上有n只螞蟻。他們的頭有的朝左,有的朝右。每隻螞蟻都只能沿著獨木橋往前爬,速度是1cm/秒。
當兩隻螞蟻碰面時,它們會同時掉頭朝著相反的反向爬行。在這些螞蟻中,有1只螞蟻感冒了,並且在和其它螞蟻碰面時,會把感冒傳染給所碰到的螞蟻。
請你計算,當所有螞蟻都爬離獨木橋時,有多少隻螞蟻會患上感冒呢?
輸入:
<code>① 輸入一個整數n(1/<code>
輸出:
<code>要求輸出1個整數,表示最後感冒的螞蟻數量。/<code>
樣例1:
<code>樣例輸入: n = 3 Xi ="5 -2 8"
樣例輸出: 1/<code>
<code>樣例輸入: n = 5 Xi ="-10 8 -20 12 25"
樣例輸出: 3 /<code>
思路分析
我們以樣例中的第2組數據來分析。按照數據,總螞蟻數為5,螞蟻的位置分別是-10、8、-20、12、25,根據題意第一個數字代表感冒的螞蟻,即-10,為了便於梳理思路,我們可繪圖如下:
由於每隻螞蟻的走路速度相同,且感冒螞蟻在-10的位置,我們可以從圖中看出位置25處螞蟻的方向向右,所以位置25是絕對不會被傳染感冒的。同理,如果位置8左邊還有螞蟻-5,則同樣不會被傳染。如下圖所示(打紅叉的為不會被傳染感冒的螞蟻)。
第一隻感冒螞蟻的運動方向有兩種情況,即向左走和向右走。
① 第一隻感冒螞蟻向左走:
這種情況就需要先判斷它的左邊是否有向右走的螞蟻,否則就會相遇且被傳染感冒。
如果它左邊沒有向右走的螞蟻,則自始至終就只有它一個感冒,不會傳染給別的螞蟻。
如果它左邊有向右走的螞蟻,那麼我們再判斷它右邊的螞蟻是否有向左走的,有的話也會被傳染感冒。
② 第一隻感冒螞蟻向右走:
這種情況就需要先判斷它右邊是否有向左走的螞蟻,否則就會相遇且被傳染感冒。
如果它右邊沒有向左走的螞蟻,則自始至終就只有它一個感冒的,不會傳染給別的螞蟻。
如果它右邊有向左走的螞蟻,那麼我們再判斷它左邊的螞蟻是否有向右走的,有的話也會被傳染感冒。
分析到這裡,我想機智的你肯定迫不及待的想打開電腦編程試一試,如果還沒有編程思路也沒關係,請跟著我一起來看看如何使用Python編程語言來實現吧!
程序編寫
1、用戶輸入,並進行有效性校驗:
2、將用戶輸入的螞蟻位置轉換為列表格式:
3、記錄螞蟻位置的絕對值列表,且使用字典記錄原始值和絕對值之間的對應關係:
4、計算第一隻感冒螞蟻左右兩邊的螞蟻數:
5、分別定義感冒螞蟻左邊向右的螞蟻數和右邊向左的螞蟻數:
6、計算第一隻感冒螞蟻左邊向右走的螞蟻數:
7、計算第一隻感冒螞蟻右邊向左走的螞蟻數:
8、如果第一隻感冒螞蟻左邊向右走的螞蟻數為0,或者右邊向左走的螞蟻數為0,則自始至終都沒有傳染給任何一個螞蟻,所以最終感冒的螞蟻數為1:
9、計算最後感冒的螞蟻數 = 第一隻感冒螞蟻左邊向右走的螞蟻數 + 第一隻感冒螞蟻右邊向左走的螞蟻數 + 本來就感冒的螞蟻數(即1):
完整代碼
下面列出完整的編程代碼,方便你一氣呵成的閱讀和思考。
最後讓我們一起來試試程序的運行效果吧:
<code>請輸入螞蟻總數n:7
請輸入所有螞蟻的位置,用空格隔開:-10
8
12
-30
-3
-45
34
最後感冒螞蟻數為:4
/<code>
今天的算法問題分享就到這裡,本篇文章較之前稍複雜一些,不過學習算法就是這樣,只要經過你的認真思考和推進,一定會得到最優解的,加油!