农夫追牛(java版)
原创
©著作权归作者所有:来自51CTO博客作者nuoyanli的原创作品,请联系作者获取转载授权,否则将追究法律责任
农夫知道一头牛的位置,想要抓住它。农夫和牛都于数轴上 ,农夫起始位于点 N(0<=N<=100000) ,牛位于点 K(0<=K<=100000) 。农夫有两种移动方式: 1、从 X移动到 X-1或X+1 ,每次移动花费一分钟 2、从 X移动到 2*X ,每次移动花费一分钟 假设牛没有意识到农夫的行动,站在原地不。最少要花多少时间才能抓住牛?
Input
一行: 以空格分隔的两个字母: N 和 K
Output
一行: 农夫抓住牛需要的最少时间,单位分钟
Sample Input
5 17
Sample Output
4
Hint
农夫使用最短时间抓住牛的方案如下: 5-10-9-18-17, 需要4分钟.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
while(cin.hasNext()) {
int n = cin.nextInt();
int k = cin.nextInt();
int[] num = new int[1<<21];
Queue<Integer> q = new LinkedList<Integer>();
q.add(n);
num[n] = 1;
while(!q.isEmpty()) {
int c = q.poll();
if(c == k) {
System.out.println(num[c] - 1);
break;
}
if(c - 1 >= 0 && num[c - 1] == 0) {
num[c - 1] = num[c] + 1;
q.add(c - 1);
}
if(c + 1 <= 100000 && num[c + 1] == 0) {
num[c + 1] = num[c] + 1;
q.add(c + 1);
}
if(c * 2 <= 100000 && num[c * 2] == 0) {
num[c * 2] = num[c] + 1;
q.add(c * 2);
}
}
}
}
}