到达网格中某个点的最小移动次数?

时间:2014-07-04 13:47:46

标签: algorithm coordinate-systems

从(0,0)开始,我必须以这样的方式到达(x,y),在任何一点上,如果上一次移动是向上/向下,我可以向左/向右移动一步,反之亦然。需要的最小移动次数是多少?

2 个答案:

答案 0 :(得分:0)

首先要注意的是:移动的顺序并不重要(向上,向上,向左相当于向上,向左,向上)。 因此约束变为number of horizontal moves = number of vertical moves ± 1

您必须移至(x, y)x + y移动),然后沿x轴移动(假设为x < y),以便number of horizontal moves = number of vertical moves ± 1

因此答案为x + y + 2*kx + 2*k = yx + 2*k = y - 1

答案 1 :(得分:0)

根据声明,每个左右运动必须遵循 up-down 移动,反之亦然,以下公式可以给你长度最短路径。

让我们假设xy是我们需要朝两个方向行走的正距离,所以

  

x,y∈ℕ + ⋃{0}

然后

  

steps = min(x,y)×2 + 4×floor(abs(x-y)/ 2)+(x + y)mod 2

其中

  • min(a,b)给出较小的ab值,例如 min(1,2)= 1 ;
  • floor(x)给出x的整个部分,没有分数部分,如 floor(4.5)= 4 ;
  • abs(x)给出x与零的正距离,如 abs(-3)= abs(3)= 3 ;
  • x mod y 给出x / y的模数(或余数),如 11/2 = 5,余数为1 ;

示例:

  • 如果(0, 10) 步骤20;
  • 如果(1, 10) 步骤19;
  • 如果(8, 5) 步骤15;
  • 如果(3, 3) 步骤6;

等...