Catch That Cow
OJ链接 :Catch That Cow
题目:
Description
农夫约翰得知了一头逃亡母牛的位置,想要马上抓住她。他从数轴上的点N(0≤N≤100,000)开始,而牛在同一数轴上的点K(0≤K≤100,000)。农夫约翰有两种交通方式:步行和心灵传送。
*步行:FJ可以在一分钟内从任意X点移动到X - 1或X + 1点
*传送:FJ可以在一分钟内从任意X点移动到2 × X点。
如果奶牛不知道自己在追它,根本不动,农夫约翰要花多长时间才能把它找回来?
Input
1行:两个用空格分隔的整数:N和K
Output
1行:农夫约翰用最少的时间,以分钟为单位,抓住逃亡的奶牛。
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 196513 Accepted: 59448
样例输入输出:
Sample Input
5 17
Sample Output
4
Hint
The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.
题目分析:
1.BFS
2.每个状态有三种可能
题目代码:
package javaBase;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Point{
public int x; //当前在数轴上哪里
public int count;//几分钟
//有参构造
public Point(int x,int y){
this.x=x;
this.count=y;
}
//无参构造
public Point(){}
}
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int k=in.nextInt();
boolean vis[]=new boolean[k*2];
Arrays.fill(vis, false);
if(n>=k) {
System.out.println(n-k);
}else {
System.out.println(bfs(n,k,vis));
}
}
private static int bfs(int xx, int k,boolean vis[]) {
//new a queue
Queue<Point> q=new LinkedList<Point>();
Point p = new Point();
p.x=xx;
p.count=0;
vis[p.x]=true;//变成TRUE
q.add(p);
while(!q.isEmpty()){
Point n=q.poll();
if(n.x>=2*k||n.x<0) {
continue;
}
if(n.x==k){
return n.count;
}else{
for(int i=0;i<3;i++){
Point n1=new Point();
if(i==0){
n1.x=n.x+1;
}else if(i==1) {
n1.x=n.x-1;
}else {
n1.x=2*n.x;
}
if((!(n1.x>=2*k||n1.x<0))&&vis[n1.x]==false){
vis[n1.x]=true;
n1.count=n.count+1;
q.add(n1);
}
}
}
}
return 0;
}
}