编程之美4.7蚂蚁爬杆扩展问题附猎人抓狐狸(必胜策略)

该博客探讨了蚂蚁在木杆上行走的问题,当蚂蚁碰头时交换方向,求最短和最长离开木杆的时间。通过巧妙的分析,将问题简化并给出解决方案。同时,提出了多个扩展问题,如蚂蚁在平面上运动、碰撞次数计算等,以及一个关于猎人如何确保抓住随机转移洞穴的狐狸的策略。
摘要由CSDN通过智能技术生成

    4.7节讲的是一根长27cm的木棍上,在5个点上有5只蚂蚁,蚂蚁在开始的时候朝任意方向出发,只能掉头或者往前走。让任意两只蚂蚁碰头时,它们同时掉头朝反方向走。假设蚂蚁的速度都是一秒一厘米,求蚂蚁都离开木棍的最短时间和最长时间。

    穷举很麻烦,书上的思路非常精巧,即把蚂蚁碰头后掉头走,看做两个蚂蚁相遇后擦肩而过。这样就可以把蚂蚁的运动看做是独立的,是否碰头并不重要。代码也很简单,不过书上的代码有个错误,最短时间和最长时间都是所有蚂蚁走出木棍的最短时间和最长时间的最大值。书上的最短时间求的是最小值,一个小错误。代码细节可参看[1]

    代码和这一题不是本文重点,重点是其后面的扩展问题和其他一些扩展

    问题1、3、4参考了[2]的解题思路~非常巧妙的思路!赞一个。


1、第i个蚂蚁,什么时候走出木杆?

    假设每一只蚂蚁都背着一袋粮食,任意两只蚂蚁碰头时交换各自的粮食然后调头。这种情况下,每次有一只蚂蚁离开木杆都表明有一袋粮食离开木杆。离开的这袋粮食花在离开木杆的时间同样也是最后背这袋粮食离开木杆的蚂蚁离开木杆所花的时间。看起来有点绕口,就是说离开木杆的蚂蚁和其最后背在背上的粮食花在离开木杆上的时间是一样的(可以理解么,因为它们的起始时间是一样的,结束时间也是一样的)。那要求第i只蚂蚁离开木杆的时间,只需要找到第i只蚂蚁最后离开时背的那袋粮食的时间就可以了。而粮食是不调头的,一直向前走。只要找到这袋粮食,只需要这袋粮食的距离除以速度就可以了。

    怎么找这袋粮食呢。先确定一个命题:若开始时有M只蚂蚁向右走,N-M只向左走,最终结果肯定是M只蚂蚁从左边走下来,N-M只蚂蚁从右边走下来(每次碰头,不改变向左向右的蚂蚁数量)——代表着,必然是

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值