來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

古代有一位書生李公子,奇愛吟詩作賦。一天,他獨自坐在院中小酌時,忽見椿樹下的一群螞蟻正在忙於搬運著食物。李公子浮想聯翩:假若有一隻螞蟻感冒了,且會傳染給碰到它的其他螞蟻,那麼在寬度只能容身一隻螞蟻的獨木橋上,當他們把食物搬運完後會有多少隻螞蟻感冒呢?

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

螞蟻大軍

李公子現在很困惑,沉思許久,他始終想不明白這個問題,於是通過時光穿梭手機打電話給你,讓你通過編程技術來解答這個問題。

我想此刻你的大腦一定飛速運轉起來了,你可以先獨立思考,且可以用任意編程語言編碼驗證。如若沒有思路,沒關係,請跟著我來一起分析。

問題梳理

長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>
來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

問題等你來解答

思路分析

我們以樣例中的第2組數據來分析。按照數據,總螞蟻數為5,螞蟻的位置分別是-10、8、-20、12、25,根據題意第一個數字代表感冒的螞蟻,即-10,為了便於梳理思路,我們可繪圖如下:

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

思路分析

由於每隻螞蟻的走路速度相同,且感冒螞蟻在-10的位置,我們可以從圖中看出位置25處螞蟻的方向向右,所以位置25是絕對不會被傳染感冒的。同理,如果位置8左邊還有螞蟻-5,則同樣不會被傳染。如下圖所示(打紅叉的為不會被傳染感冒的螞蟻)。

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

思路分析

第一隻感冒螞蟻的運動方向有兩種情況,即向左走和向右走。

① 第一隻感冒螞蟻向左走:

這種情況就需要先判斷它的左邊是否有向右走的螞蟻,否則就會相遇且被傳染感冒。

如果它左邊沒有向右走的螞蟻,則自始至終就只有它一個感冒,不會傳染給別的螞蟻。

如果它左邊有向右走的螞蟻,那麼我們再判斷它右邊的螞蟻是否有向左走的,有的話也會被傳染感冒。

② 第一隻感冒螞蟻向右走:

這種情況就需要先判斷它右邊是否有向左走的螞蟻,否則就會相遇且被傳染感冒。

如果它右邊沒有向左走的螞蟻,則自始至終就只有它一個感冒的,不會傳染給別的螞蟻。

如果它右邊有向左走的螞蟻,那麼我們再判斷它左邊的螞蟻是否有向右走的,有的話也會被傳染感冒。


分析到這裡,我想機智的你肯定迫不及待的想打開電腦編程試一試,如果還沒有編程思路也沒關係,請跟著我一起來看看如何使用Python編程語言來實現吧!

程序編寫

1、用戶輸入,並進行有效性校驗:

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

輸入與校驗

2、將用戶輸入的螞蟻位置轉換為列表格式:

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

位置數據處理

3、記錄螞蟻位置的絕對值列表,且使用字典記錄原始值和絕對值之間的對應關係:

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

記錄對應關係

4、計算第一隻感冒螞蟻左右兩邊的螞蟻數:

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

螞蟻數記錄

5、分別定義感冒螞蟻左邊向右的螞蟻數和右邊向左的螞蟻數:

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

記錄螞蟻數

6、計算第一隻感冒螞蟻左邊向右走的螞蟻數:

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

記錄螞蟻數

7、計算第一隻感冒螞蟻右邊向左走的螞蟻數:

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

記錄螞蟻數

8、如果第一隻感冒螞蟻左邊向右走的螞蟻數為0,或者右邊向左走的螞蟻數為0,則自始至終都沒有傳染給任何一個螞蟻,所以最終感冒的螞蟻數為1:

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

邏輯判斷

9、計算最後感冒的螞蟻數 = 第一隻感冒螞蟻左邊向右走的螞蟻數 + 第一隻感冒螞蟻右邊向左走的螞蟻數 + 本來就感冒的螞蟻數(即1):

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

計算結果

完整代碼

下面列出完整的編程代碼,方便你一氣呵成的閱讀和思考。

來挑戰螞蟻感冒的算法問題?給你10分鐘,還有Python編程解法

完整代碼

最後讓我們一起來試試程序的運行效果吧:

<code>

請輸入螞蟻總數n:7

請輸入所有螞蟻的位置,用空格隔開:-10

8

12

-30

-3

-45

34

最後感冒螞蟻數為:4

/<code>

今天的算法問題分享就到這裡,本篇文章較之前稍複雜一些,不過學習算法就是這樣,只要經過你的認真思考和推進,一定會得到最優解的,加油!


分享到:


相關文章: