Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 98735 | Accepted: 30980 |
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
Hint
- 题目大意:
一个人和一头牛,分别站在N位置和K位置,牛是不动的,人可以有三种方式移动:X-1、X+1、2*X,问最短多少步可以抓住牛。
- 解题思路:
广搜的题,需要注意几点——
①牛可能在人左边。
②用了address数组记录人到过的位置,防止重复搜索。
③小于0的,大于100000的直接忽略。
- 代码如下:
import java.util.*;
public class Main
{
public static int n,m;
public static final int MAX = 100003;
public static int[] address = new int[MAX+1];
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
System.out.println(bfs());
}
public static int bfs()
{
Queue<Step>q = new LinkedList();
q.add(new Step(n,0));
while(true)
{
Step tem = q.peek();
if(tem.x==m)return tem.id;
q.poll();
if(tem.x-1>=0 && address[tem.x-1]==0)
q.add(new Step(tem.x-1,tem.id+1));
if(tem.x+1<=MAX && address[tem.x+1]==0)
q.add(new Step(tem.x+1,tem.id+1));
if(tem.x*2<=MAX && address[tem.x*2]==0)
q.add(new Step(tem.x*2,tem.id+1));
}
}
public static class Step
{
int x;
int id;
public Step(int x,int id)
{
this.id = id;
this.x = x;
address[x]=1;
}
}
}