2024-10-6青训营刷题笔记-计算位置×到y的最少步数

0 阅读2分钟

计算位置×到y的最少步数

AB 实验同学每天都很苦恼如何可以更好地进行 AB 实验,每一步的流程很重要,我们目标为了缩短所需的步数。

我们假设每一步对应到每一个位置。从一个整数位置 x 走到另外一个整数位置 y,每一步的长度是正整数,每步的值等于上一步的值 -1+0+1。求 xy 最少走几步。并且第一步必须是 1,最后一步必须是 1,从 xy 最少需要多少步。

样例说明

  • 整数位置 x12,另外一个整数位置 y6,我们需要从 x 走到 y,最小的步数为:1221,所以我们需要走 4 步。
  • 整数位置 x34,另外一个整数位置 y45,我们需要从 x 走到 y,最小的步数为:123221,所以我们需要走 6 步。
  • 整数位置 x50,另外一个整数位置 y30,我们需要从 x 走到 y,最小的步数为:12344321,所以我们需要走 8 步。

输入格式

输入包含 2 个整数 xy。(0<=x<=y<2^31

输出格式

对于每一组数据,输出一行,仅包含一个整数,从 xy 所需最小步数。

输入样例

12 6
34 45
50 30

输出样例

4
6
8

思路:

主体就是广度优先搜索算法,
将问题转化为一点到另一点的距离图
参数设置参考:
1.节点对象:位置,当前步大小,已耗费步数,历史布大小(调试用)
2.队列,BFS搜索用
3.节点类型的set,保存达到终点并符合要求的步骤
4.字符类型的set,节点去重,字符为 节点属性拼接成的字符

细节:
1.当前节点的位置等于终点并且当前节点的步大小==1,就加入到set中,方便最后从set中找寻最小耗费步数的节点
2.如果当前节点的耗费步数为0,那么他的本次步大小只能是1,耗费步数》0,则为三种情况,三种情况都要循环
3.通过set筛选需不需要加入到队列中,如果位置,步大小,耗费步数都一致,有一个就够了(属于优化)
4.历史步大小我设置为了arrayList,加值的时候不能=引用,应该
List<Integer> tmp = new ArrayList<>(current.hisStep);
tmp.add(step);