百度面试题的解答

老S从网上发来一道百度的面试题。题目如下
有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,
蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒
钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间

  这个其实就是一个生命游戏(game of life), 这里有些介绍。构造一个世界和5个蚂蚁,每次心跳,每只蚂蚁按照各自的方向爬一步,然后检查一下边界条件就可以。用python写了段代码,得到结果:最快11秒,最慢25秒。代码如下
# coding:utf-8
class  Ant:
    
def   __init__ (self,d,p):
        self.pos
= p
        self.dir
= d   # 0,1,1-->from l to r
    
    
def  step(self):
        
if  self.dir == 1 :
            self.pos
+= 1
        
else :
            self.pos
-= 1

def  itr_and_del(L,func):
    i
= 0
    
while  i < len(L):
        
if  func(L[i]):
            i
+= 1
        
else :
            
del  L[i]
                
class  World:
    
def   __init__ (self):
        self.time
= 0
        self.ants
= []
    
    
def  create_ant(self,pos_list):
        self.ants
= []
        
for  p,d  in  pos_list:
            self.ants.append(Ant(p,d))
        
    
    
def  run(self):
        self.time
= 0
        
while  self.tick():
            self.time
+= 1
            
if  self.time > 1000 :
                
print   ' dead '
                
return
        
print   ' used:%d '   %  self.time
            
    
def  tick(self):
        
# 检查碰撞
        self.ants.sort(key = lambda  x:x.pos)
        i
= 0
        
while  i < len(self.ants) - 1 :
            a
= self.ants[i]
            b
= self.ants[i + 1 ]
            
if  abs(a.pos - b.pos) == 1 :
                a.dir
=- a.dir
                b.dir
=- b.dir
            i
+= 1    
        
# 运动
         for  a  in  self.ants:
            a.step()
       
# 检查边界
         def  in_world(a):
            
return  a.pos  >=  0  and  a.pos  <=   27
        itr_and_del(self.ants,in_world)
       
        
return  len(self.ants) != 0

def  dummy():
    ret
= []
    
for  a1  in  (0, 1 ):
        
for  a2  in  (0, 1 ):
            
for  a3  in  (0, 1 ):
                
for  a4  in  (0, 1 ):
                    
for  a5  in  (0, 1 ):
                        ret.append(((a1,
3 ),(a2, 7 ),(a3, 11 ),(a4, 17 ),(a5, 23 )))
    
return  ret
     
if   __name__   ==   " __main__ " :
    w 
=  World()
    
for  r  in  dummy():
        w.create_ant(r)
        w.run()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值