Algorithm 到达网格中某一点的最小移动次数?
从(0,0)开始,我必须以这样一种方式到达(x,y),即如果上一步是向上/向下的,我可以在任何点向左/向右移动一步,反之亦然。所需的最少移动次数是多少?首先要注意的是:移动的顺序并不重要(向上、向上、向左等于向上、向左、向上)。 因此,约束变成Algorithm 到达网格中某一点的最小移动次数?,algorithm,coordinate-systems,Algorithm,Coordinate Systems,从(0,0)开始,我必须以这样一种方式到达(x,y),即如果上一步是向上/向下的,我可以在任何点向左/向右移动一步,反之亦然。所需的最少移动次数是多少?首先要注意的是:移动的顺序并不重要(向上、向上、向左等于向上、向左、向上)。 因此,约束变成水平移动次数=垂直移动次数±1 您必须移动到(x,y)(x+y移动),然后沿x轴移动(假设x
水平移动次数=垂直移动次数±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
的较小值,如min(1,2)=1李>b
- 楼层(x)给出了
的整个部分,没有分数部分,如楼层(4.5)=4李>x
- abs(x)给出了
与零的正距离,如abs(-3)=abs(3)=3李>x
- x mod y给出了
的模数(或余数),如11/2=5,余数为1李>x/y
- 在
的情况下,步骤是(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
any
总是等于或大于零。这就是我在公式中所说的。如果其中任何一个可以是负数,在使用公式之前,您需要取该数字的abs(…)
。@用户,请详细说明。