计算从位置 x 到 y 的最少步数
小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1,+0 或 +1)。首末两步的步长必须是 1。求从 x 到 y 的最少步数。
1.思路分析:
首先,我们要明确目标是求出从位置 x 移动到位置 y 的最少步数,并且每步的移动范围是上一步的 -1,+0 或 +1,首末两步的步长必须是 1。我们先计算出 x 和 y 之间的距离(绝对值),也就是要跨越的总距离 distance。然后采用贪心的策略来逐步减少这个距离。我们从步长 step 为 1 开始,每次尝试尽可能多地减少距离。如果当前距离 distance 大于等于当前步长 step 的两倍(意味着可以进行正向移动一步和反向移动一步,这样可以最大程度地利用规则且减少步数),那就减去 step * 2,同时步数 steps 增加 2,并且步长 step 自增 1,表示下一轮可以移动更大的范围了。如果距离 distance 大于等于当前步长 step 但小于 step * 2,那就只进行正向移动一步(减少 step 距离),步数 steps 增加 1。要是距离 distance 已经小于当前步长 step 了,那就说明前面步子迈大了,需要把步长 step 减 1,再重新判断如何移动来减少距离,直到距离 distance 变为 0,此时的 steps 就是最少步数了。
2.代码详解:
int distance = abs(yPosition - xPosition);:这行代码首先计算出起始位置 xPosition 和目标位置 yPosition 之间的距离,使用 abs 函数获取绝对值。int steps = 0; int step = 1;:分别初始化步数 steps 为 0(用来记录总共走了多少步),步长 step 为 1(按照规则首步步长为 1)。while (distance > 0):这个循环的条件是只要还有距离需要跨越(distance 大于 0),就继续循环尝试移动。if (distance >= step * 2) 分支:判断如果当前距离大于等于当前步长的两倍,就执行 distance -= step * 2; steps += 2; step++;。意思是可以按照规则正向走一步、反向走一步(减少 step * 2 的距离),所以总步数 steps 增加 2,然后下一轮步长 step 增加 1,准备下一次更大范围的移动。else if (distance >= step) 分支:当距离不满足大于等于 step * 2,但大于等于 step 时,执行 distance -= step; steps++;,也就是只正向走一步(减少 step 的距离),步数 steps 增加 1。else 分支:当距离已经小于当前步长 step 时,执行 step--,把步长减 1,重新去判断如何移动来减少距离,因为前面可能步子迈大了。最后函数返回 steps,就是从 x 到 y 所需要的最少步数。在 main 函数中,通过调用 solution 函数传入不同的参数进行测试,并将返回结果与预期结果进行比较后输出。