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

Algorithm 到达网格中某一点的最小移动次数?,algorithm,coordinate-systems,Algorithm,Coordinate Systems,从(0,0)开始,我必须以这样一种方式到达(x,y),即如果上一步是向上/向下的,我可以在任何点向左/向右移动一步,反之亦然。所需的最少移动次数是多少?首先要注意的是:移动的顺序并不重要(向上、向上、向左等于向上、向左、向上)。 因此,约束变成水平移动次数=垂直移动次数±1 您必须移动到(x,y)(x+y移动),然后沿x轴移动(假设x

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

首先要注意的是:移动的顺序并不重要(向上、向上、向左等于向上、向左、向上)。 因此,约束变成
水平移动次数=垂直移动次数±1

您必须移动到
(x,y)
x+y
移动),然后沿x轴移动(假设
x
),以便
水平移动次数=垂直移动次数±1


因此答案是
x+y+2*k
,因此
x+2*k=y
x+2*k=y-1
根据这一说法,因为每一次左右移动都必须遵循上下移动,反之亦然,下面的公式可以给出最短路径的长度

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

x、 y∈ ℕ+ ⋃ {0}

然后

步数=最小(x,y)×2+4×地板(abs(x-y)/2)+(x+y)模态2

在哪里

  • min(a,b)给出
    a
    b
    的较小值,如min(1,2)=1
  • 楼层(x)给出了
    x
    的整个部分,没有分数部分,如楼层(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

等等。

最大值约为2*x(x,y),最多取2。但是我不确定堆栈溢出是否是这个问题的正确位置。因此,如果你写了一个算法,它可能是正确的地方,但它有一些问题。你这里的“之字形”是什么意思?@Dialogicus,必须有一个准确的答案。显然,
x+y
步骤是最基本的。@holex只有在abs(x-y)我试图理解你的答案(仅用于学习目的)的情况下,我不太清楚
k
从何而来。。。在我看来,它是一个未定义的未知值。这到底是什么?我假设
x
an
y
总是等于或大于零。这就是我在公式中所说的。如果其中任何一个可以是负数,在使用公式之前,您需要取该数字的
abs(…)
。@用户,请详细说明。