蚂蚁大军
李公子现在很困惑,沉思许久,他始终想不明白这个问题,于是通过光阴穿梭手机打电话给你,让你通过编程技能来解答这个问题。
我想此刻你的大脑一定飞速运转起来了,你可以先独立思考,且可以用任意编程措辞编码验证。如若没有思路,没紧要,请随着我来一起剖析。

长100厘米的独木桥上有n只蚂蚁。他们的头有的朝左,有的朝右。每只蚂蚁都只能沿着独木桥往前爬,速率是1cm/秒。
当两只蚂蚁碰面时,它们会同时掉头朝着相反的反向爬行。在这些蚂蚁中,有1只蚂蚁感冒了,并且在和其它蚂蚁碰面时,会把感冒传染给所碰到的蚂蚁。
请你打算,当所有蚂蚁都爬离独木桥时,有多少只蚂蚁会患上感冒呢?
输入:
① 输入一个整数n(1<n<50),表示蚂蚁的数量。② 输入n个用空格分开的整数Xi(-100<Xi<100),Xi的绝对值表示蚂蚁离开杆子左边端点的间隔,正值表示头朝右,负值表示头朝左,数据中不会涌现0值,也不会涌现两只蚂蚁占用同一位置的情形。个中,第一个数字代表的蚂蚁感冒了。
输出:
哀求输出1个整数,表示末了感冒的蚂蚁数量。
样例1:
样例输入:n = 3Xi = "5 -2 8"样例输出:1
样例输入:n = 5Xi = "-10 8 -20 12 25"样例输出:3
问题等你来解答
思路剖析我们以样例中的第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):
打算结果
完全代码下面列出完全的编程代码,方便你一气呵成的阅读和思考。
完全代码
末了让我们一起来试试程序的运行效果吧:
请输入蚂蚁总数n:7请输入所有蚂蚁的位置,用空格隔开:-10 8 12 -30 -3 -45 34末了感冒蚂蚁数为:4
本日的算法问题分享就到这里,本篇文章较之前稍繁芜一些,不过学习算法便是这样,只要经由你的负责思考和推进,一定会得到最优解的,加油!