来挑战蚂蚁感冒的算法问题?给你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>

今天的算法问题分享就到这里,本篇文章较之前稍复杂一些,不过学习算法就是这样,只要经过你的认真思考和推进,一定会得到最优解的,加油!


分享到:


相關文章: