【问题标题】:Minimum number of moves to reach a point in a grid?到达网格中一个点的最少移动次数?
【发布时间】:2014-07-04 13:47:45
【问题描述】:

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

【问题讨论】:

  • 大约是 2*max(x,y),最多取 2。但我不确定 Stack Overflow 是否适合回答这个问题。如果你写了一个算法,那么 SO 可能是正确的地方,但它有问题。
  • 这里的曲折是什么意思?
  • @Dialectus,必须有一个准确的答案。
  • 显然x + y 步骤是最少的。
  • @holex 仅在 abs(x-y)

标签: algorithm coordinate-systems


【解决方案1】:

根据每个左右动作必须跟随一个上下动作的说法,反之亦然,下面的公式可以给你的长度最短路径。

让我们假设xy 是我们需要双向行走的正距离,所以

x, y ∈ ℕ+ ⋃ {0}

然后

步数 = 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

等等……

【讨论】:

  • 我假设 xy 总是等于或大于零。这就是我发明公式的原因。如果其中任何一个可能为负,则在使用公式之前,您需要采用该数字的abs(...)
  • @user,请详细说明。
【解决方案2】:

首先要注意:移动的顺序并不重要(上、上、左等价于上、左、上)。 所以约束变为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*k,因此x + 2*k = yx + 2*k = y - 1

【讨论】:

  • 我试图理解你的答案(仅用于学习目的),我不太清楚k 来自哪里......在我看来它是一个未定义和未知的价值。那实际上是什么?
猜你喜欢
  • 2018-09-11
  • 2020-04-17
  • 2014-04-21
  • 2016-07-03
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多