4.7节讲的是一根长27cm的木棍上,在5个点上有5只蚂蚁,蚂蚁在开始的时候朝任意方向出发,只能掉头或者往前走。让任意两只蚂蚁碰头时,它们同时掉头朝反方向走。假设蚂蚁的速度都是一秒一厘米,求蚂蚁都离开木棍的最短时间和最长时间。
穷举很麻烦,书上的思路非常精巧,即把蚂蚁碰头后掉头走,看做两个蚂蚁相遇后擦肩而过。这样就可以把蚂蚁的运动看做是独立的,是否碰头并不重要。代码也很简单,不过书上的代码有个错误,最短时间和最长时间都是所有蚂蚁走出木棍的最短时间和最长时间的最大值。书上的最短时间求的是最小值,一个小错误。代码细节可参看[1]
代码和这一题不是本文重点,重点是其后面的扩展问题和其他一些扩展。
问题1、3、4参考了[2]的解题思路~非常巧妙的思路!赞一个。
1、第i个蚂蚁,什么时候走出木杆?
假设每一只蚂蚁都背着一袋粮食,任意两只蚂蚁碰头时交换各自的粮食然后调头。这种情况下,每次有一只蚂蚁离开木杆都表明有一袋粮食离开木杆。离开的这袋粮食花在离开木杆的时间同样也是最后背这袋粮食离开木杆的蚂蚁离开木杆所花的时间。看起来有点绕口,就是说离开木杆的蚂蚁和其最后背在背上的粮食花在离开木杆上的时间是一样的(可以理解么,因为它们的起始时间是一样的,结束时间也是一样的)。那要求第i只蚂蚁离开木杆的时间,只需要找到第i只蚂蚁最后离开时背的那袋粮食的时间就可以了。而粮食是不调头的,一直向前走。只要找到这袋粮食,只需要这袋粮食的距离除以速度就可以了。
怎么找这袋粮食呢。先确定一个命题:若开始时有M只蚂蚁向右走,N-M只向左走,最终结果肯定是M只蚂蚁从左边走下来,N-M只蚂蚁从右边走下来(每次碰头,不改变向左向右的蚂蚁数量)——代表着,必然是