POJ 3278
农夫约翰已被告知一头逃犯的位置,并希望立即抓住她。他开始于一个点Ñ(0≤ Ñ在数轴上≤100,000)和母牛是在点ķ(0≤ ķ上相同数目的线≤100,000)。农夫约翰有两种运输方式:步行和传送。
*步行:FJ可以在一分钟内从任意点X移至点X -1或X + 1。
*传送:FJ可以在一分钟内从任意点X移至点2× X。
如果没有意识到它的追捕能力的母牛根本没有动弹,那么农夫约翰要花多长时间?
输入项
第1行:两个以空格分隔的整数: N和 K
输出量
第1行:农夫约翰用最少的时间(以分钟为单位)捉住逃犯。
样本输入
5 17
样本输出
4
暗示
农夫约翰到达逃亡者牛的最快方法是沿着以下路径移动:5-10-9-18-17,这需要4分钟。
解题思路
bfs+队列+剪枝
每走一步,进行三次选择,没有先后顺序
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int n,k;
static int[] vis = new int[100010];
static int[] a=new int[100010];
public static void bfs(int n) {
Queue<Integer> q = new LinkedList<Integer>();
q.add(n);
vis[n] = 1;
while (!q.isEmpty()) {
int t = q.poll();
if(t == k) {
System.out.println(a[k]);
return;
}
int next;
for (int i = 0; i < 3; i++) {
if (i == 0) next = t * 2;
else if(i == 1) next = t + 1;
else next = t - 1;
if (next <= 0 || next >= 100005) continue;
if (vis[next] == 0) {
q.add(next);
vis[next] = 1;
a[next] = a[t] + 1;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
k = sc.nextInt();
for(int i=0;i<100010;i++) {
vis[i] = 0;
}
if(n >= k) {
System.out.println(n-k);
}else {
bfs(n);
}
}
}