计算位置x到y的最小步数
问题描述
AB 实验同学每天都很苦恼如何可以更好地进行 AB 实验,每一步的流程很重要,我们目标为了缩短所需的步数。
我们假设每一步对应到每一个位置。从一个整数位置 x
走到另外一个整数位置 y
,每一步的长度是正整数,每步的值等于上一步的值 -1
, +0
,+1
。求 x
到 y
最少走几步。并且第一步必须是 1
,最后一步必须是 1
,从 x
到 y
最少需要多少步。
样例说明
- 整数位置
x
为12
,另外一个整数位置y
为6
,我们需要从x
走到y
,最小的步数为:1
,2
,2
,1
,所以我们需要走4
步。 - 整数位置
x
为34
,另外一个整数位置y
为45
,我们需要从x
走到y
,最小的步数为:1
,2
,3
,2
,2
,1
,所以我们需要走6
步。 - 整数位置
x
为50
,另外一个整数位置y
为30
,我们需要从x
走到y
,最小的步数为:1
,2
,3
,4
,4
,3
,2
,1
,所以我们需要走8
步。
输入格式
输入包含 2
个整数 x
,y
。(0<=x<=y<2^31
)
输出格式
对于每一组数据,输出一行,仅包含一个整数,从 x
到 y
所需最小步数。
输入样例
12 6
34 45
50 30
输出样例
4
6
8
问题描述
我们需要从整数位置 x
走到整数位置 y
,每一步的长度是正整数,并且每一步的步长只能是上一步的步长 -1
、+0
或 +1
。要求第一步和最后一步的步长必须是 1
。我们的目标是找到从 x
到 y
所需的最小步数。
分析
为了更好地理解问题,我们可以将其分解为几个部分:
- 步长变化:每一步的步长只能是上一步的
-1
、+0
或+1
。 - 第一步和最后一步:第一步和最后一步的步长必须是
1
。 - 最小步数:我们需要找到从
x
到y
的最小步数。
解决方案
我们可以通过以下步骤来解决这个问题:
-
计算距离:首先计算
x
和y
之间的绝对距离d = |x - y|
。 -
处理特殊情况
:对于一些特殊情况,我们可以直接给出答案(先打个表):
- 如果
d == 0
,即x == y
,我们需要走0
步(不用走)。 - 如果
d == 1
,即x
和y
之间的距离是1
,我们只需要1
步。 - 如果
d == 2
,即x
和y
之间的距离是2
,我们需要2
步。 - 如果
d == 3
,即x
和y
之间的距离是3
,我们需要3
步。
- 如果
-
一般情况:其实我们分析一下题目可以发现,如果追求最短步骤,不可能会出现走“回头路”这一现象的,比如我先前进3步又后退两步,所以我只会一直前进或者一直后退,在这里我们取了距离的绝对值不妨假设到达终点需要一直前进。
首先开头和结尾的步长必是
1
如果我们中间走一步,我们最大只能走
1 2 1
这种情况,总距离<=4,那么一共只需要走1+2步就可以!如果我们中间走两步,我们最大只能走
1 2 2 1
这种情况,总距离大于4小于等于7,一共只需要4步即可!聪明的你已经发现:
如果中间只能走3步,那么最大的序列是
1 2 3 2 1
如果中间只能走4步,那么最大的序列是
1 2 3 3 2 1
…
所以我们只要知道
距离
并且知道它位于第几步到第几步的区间
我们就直接能判别最少需要几步即可!一个简单的while循环搞定,如果超过就-1步即可~
下面是代码:
def solution(x_position, y_position):
d = abs(x_position - y_position)
step = 2
t = 1
ans = 0
if(d == 0): return 0
elif (d == 1): return 1
elif (d == 2): return 2
elif (d == 3): return 3
else:
while(ans<(d-2)):
if(t % 2 == 1):
ans = ans + step
t = t + 1
#print(t,' ',ans)
else:
ans = ans + step
step = step + 1
t = t + 1
#print(t,' ',ans)
return t + 1
if __name__ == "__main__":
# You can add more test cases here
print(solution(12, 6) == 4 )
print(solution(34, 45) == 6)
print(solution(50, 30) == 8)