package Week2;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
//题意:在同一行,由n到达k,有三种操作,每种操作花费1分钟:x+1,x-1,x*2。求所需最小时间。
//注不知道N大还是K大,所以N大的时候要减去不能乘以2,所以直接判断每个数字小于等于10000就好了,跳出条件是N==K跳出循环
/*农场主约翰已被告知一头逃亡母牛的位置,并希望立即抓住她。他从N(0)点开始≤ N≤ 100000)且奶牛位于点K(0≤ K≤ 100000)在同一号码线上。
农夫约翰有两种交通方式:步行和心灵运输。
*步行:FJ可以在一分钟内从任意点X移动到点X-1或X+1
*传送:FJ可以在一分钟内从任意点X移动到点2×X。
如果这头牛没有意识到它的追赶,根本就不动,农夫约翰要花多长时间才能找回它?*/
public class B_BFS {
static int N,K;
static boolean visited[];
static int loa[] = new int[]{1,-1,2};
static int ans;
static Queue<int[]> pq = new LinkedList<int[]>();
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("Solution.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
visited = new boolean[100001];
pq.clear();
pq.add(new int[]{N,0});//int数组表示int[0]表示每次移动目标数,int[1]移动的分钟总数
visited[N]=true;
ans = 0;
ans = bfs();
System.out.println(ans);
}
private static int bfs() {
while(!pq.isEmpty()) {
int[] curr = pq.poll();
for (int i = 0; i < loa.length; i++) {
int next = 0;
if(loa[i]==1) {
next = curr[0]+1;//坐标每次移动位置+1
}
if(loa[i]==-1) {
next = curr[0]-1;//坐标每次移动位置-1
}
if(loa[i]==2) {
next = curr[0]*2;//坐标每次移动位置*2
}
int num = 0;
if(isValid(next) && !visited[next]) {
visited[next]=true;
num = curr[1]+1;//每移动一步,分钟数加1
pq.add(new int[] {next,num});
}
if(next == K) {//当目标数字等于牛的坐标时退出
return num;
}
}
}
return 0;
}
private static boolean isValid(int next) {
//注不知道N大还是K大,所以N大的时候要减去不能乘以2,所以直接判断每个数字小于等于10000就好了,跳出条件是N==K跳出循环
if(next >=0 && next<=100000) {
return true;
}
return false;
}
}