Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 81563 | Accepted: 25654 |
Description
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.
* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.
If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
Input
Output
Sample Input
5 17
Sample Output
4
题意:约翰要追逃跑的奶牛。给出约翰的位置n和奶牛的位置k,约翰每分钟可向前移动以一个单位的距离,或者向后移动一个单位的距离,或者移动到本位置2倍距离的地方。而奶牛待在原地不动。问约翰至少需要移动几分钟抓住奶牛?
思路:bfs即可,这种类型题目在CS专业考研机试和IT公司笔试中出现过。
/*
* @source: POJ-3278
* @result: Accepted/4692K/1735MS/Java/1028B
* @author: vcodes
* @time: 2017-01-08 18:38:05
*/
import java.util.Scanner;
import java.util.Deque;
import java.util.ArrayDeque;
import java.util.Arrays;
class Node {
int pos;
int step;
Node() {
}
Node(int pos, int step) {
this.pos = pos;
this.step = step;
}
}
public class Main {
Scanner in = new Scanner(System.in);
static final int MAXN = 100001;
int n, k;
int[][] d = { { 1, -1 }, { 1, 1 }, { 2, 0 } };
boolean[] vis = new boolean[MAXN];
Main() {
while (in.hasNext()) {
Arrays.fill(vis, false);
n = in.nextInt();
k = in.nextInt();
Deque<Node> que = new ArrayDeque<Node>();
que.offer(new Node(n, 0));
vis[n] = true;
while (!que.isEmpty()) {
Node now = que.poll();
if (now.pos == k) {
System.out.println(now.step);
break;
}
for (int i = 0; i < 3; ++i) {
int netX = now.pos * d[i][0] + d[i][1];
if (0 <= netX && netX < MAXN && !vis[netX]) {
vis[netX] = true;
que.offer(new Node(netX, now.step + 1));
}
}
}
}
}
public static void main(String[] args) {
new Main();
}
}