答与微博前端教主在吃饭时讨论到的一道"微软面试题"

加引号是因为我不知道是否真是微软面试题。题目是这样的:

 

有一车在某无限长公路上行驶,其起始位置和单位时间内速度均为有限大整数(正负不确定), 现有一仪器,在每一时间单位内可以探测1次车是否在指定位置,求一方法能在有限时间内求出车的速度和初始位置。

 

答曰:

解此题目分为两个步骤,第一个步骤,探测到车一次

第二个步骤,求出车的速度和位移。

 

先解答第一步骤,

 

显然,假设车位移为s,速度为v,在时间t时车的位置必定为 s+v*t

 

现在我在时间t时,可以对<s,v>值做出一次猜测<x,y>,然后探测位置 x+y*t,若这个位置有车,则第一步骤得解,若这个位置无车,则必定说明猜测<x,y>是不正确的,即可以排除解<x,y>

 

所以现在我们要构造一个序列 <x(t),y(t)>,使得对于任意的<s,v>取值,总有有限大的t使得 <x(t),y(t)> 值为 <s,v>,此问题之几何意义为将平面中的所有点映射到一个序列,下面给出其中一种最容易编程实现的解。(吃饭时我说的是螺旋形映射,但是想来似乎不如菱形映射容易编程实现)

假设s与v绝对值之和为m,则m必定有限,现在可以用以下代码所示算法检测:

var t = 0;
for(var m = 0; m < Infinity; m++) {

    for(var x = 0; x <= m; x++) {
         var y = m - x;

         if(check(x+y*(t++))) {
             break;
         }
         if(check(x+(-y)*(t++))) {
             break;
         }
         if(check((-x)+y*(t++))) {
             break;
         } 
         if(check((-x)+(-y)*(t++))) {
             break;
         } 

    } 

}  
//我知道你们看完代码肯定想揍我,没错,前面那一堆废话其实说的就是这么简单的事情......

第二个步骤,

因为第一步骤的假设<x,y>并非位置的必要条件,所以无法反过来得出探测命中车之后<s,v>必定为<x,y>。但是我们知道车的现在位置之后,可以车之速度为x,依0,1,-1,2,-2,3,-3......这样的序列依次猜测,第二次命中即可得到速度v。

由速度又可以算出初始位置s 

 

 

posted @ 2012-07-08 19:57 winter-cn 阅读(...) 评论(...) 编辑 收藏