【面試總結】機器人相遇問題
趕集網面試題
題目描述:
在一條左右水平放置的直線軌道上任選兩個點,放置兩個機器人,請用如下指令系統為機器人設計控制程式,使這兩個機器人能夠在直線軌道上相遇。(注意兩個機器人用你寫的同一個程式來控制)
指令系統:只包含4條指令,向左、向右、條件判定、無條件跳轉。其中向左(右)指令每次能控制機器人向左(右)移動一步;條件判定指令能對機器人所在的位置進行條件測試,測試結果是如果對方機器人曾經到過這裡就返回true,否則返回false;無條件跳轉,類似彙編裡面的跳轉,可以跳轉到任何地方。
分析:我儘量以最清晰的方式來說明這個問題(大部分內容來自ivan,big等人的討論):
1、
start:
if(at the position other robots have not reached)
move_right
if(at the position other robots have reached)
move_right
move_right
goto start
再簡單解釋下上面的虛擬碼(@big):
A------------B
| |
在A到達B點前,兩者都只有第一條if為真,即以相同的速度向右移動,在A到達B後,A只滿足第二個if,即以兩倍的速度向右移動,B依然只滿足第一個if,則速度保持不變,經過|AB|/move_right個單位時間,A就可以追上B。
2、有個細節又出現了,正如ivan所說,
if(at the position other robots have reached)
move_right
move_right
上面這個分支不一定能提速的。why?因為如果if條件花的時間很少,而move指令發的時間很大(實際很可能是這樣),那麼兩個機器人的速度還是基本是一樣的。
那作如何修改呢?:
start:
if(at the position other robots have not reached)
move_right
move_left
move_right
if(at the position other robots have reached)
move_right
goto start
-------
這樣改後,A的速度應該比B快了。
3、然要是說每個指令處理速度都很快,AB豈不是一直以相同的速度右移了?那到底該作何修改呢?請看:
go_step()
{
向右
向左
向右
}
--------
三個時間單位才向右一步
go_2step()
{
向右
}
------