致歉:之前贴的代码有bug。
题目描述:
有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
当然,这道题目可以不用编程做,注意到“两只蚂蚁会同时调头朝反方向走”,也就是一秒钟两只蚂蚁完成调头和反方向爬行两个动作,可以理解为蚂蚁穿越了对方毫无影响地原方向前进(或者将两只蚂蚁互换来看待),那么
最大时间就取决于两头的蚂蚁的方向:
如果23厘米处的蚂蚁向原点爬行离开木杆,需用时23秒;如果3厘米处的蚂蚁向27厘米处爬行离开木杆,需用27-3=24秒,所以最大用时为24秒。
最小时间就取决于中间蚂蚁朝两头跑所用时间:
如果处于小于等于11厘米处的蚂蚁向原点爬行离开木杆,需用时11秒;如果大于11厘米处的蚂蚁向27厘米处爬行离开木杆,需用27-17=10秒,所以都爬出最小用时为11秒。
但如果面试官要求编写程序,那就老实编程吧,以下是一个Java编写的程序,以及编程思路。
思路与建模
- 将木杆看成0至27的坐标, 5只蚂蚁分别在3, 7, 11, 17, 23的位置
- 创建enum Direction{ Left, Right}
- 创建Ant类, 蚂蚁可以爬行(walk), 掉头(shift), 以及记录是否已经爬出的标记.
- 创建Controller类, 给定蚂蚁的初始方向, Controller类可以计算出在这种初始方向下蚂蚁全部爬

本文介绍了百度面试题中5只蚂蚁走木棍问题的非递归解法,详细解析了最小和最大时间的计算,并提供了Java程序实现。文章通过创建蚂蚁类和Controller类来模拟蚂蚁移动,利用二进制表示蚂蚁的初始方向,最后通过Simulator类求解所有可能的方向组合,找出最短和最长离开木杆的时间。
最低0.47元/天 解锁文章
4106





