计算位置×到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
思路:
主体就是广度优先搜索算法,
将问题转化为一点到另一点的距离图
参数设置参考:
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);