【题目描述】
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
【输入】
两个整数,N和K。
【输出】
一个整数,农夫抓到牛所要花费的最小分钟数。
【输入样例】
5 17
【输出样例】
4
思路
从+1、-1、*2三个方向进行广搜即可
代码
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int m;
static int[] visit = new int[1000000];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
m = in.nextInt();
System.out.println(BFS(n));
}
public static int BFS(int n) {
int time=0;
Node next;
Node head = new Node(n,0);
Queue<Node> queue = new LinkedList<Node>();
queue.offer(head);
visit[head.x]=1;
while(!queue.isEmpty()) {
next=queue.poll();
int num=next.x;
if(num==m) {
return next.step;
}
else {
int a=num+1,b=num-1,c=num*2;
if(a>=0 && a<=100000 && visit[a]==0) {
queue.offer(new Node(a,next.step+1));
visit[a]=1;
}
if(b>=0 && b<=100000 && visit[b]==0) {
queue.offer(new Node(b,next.step+1));
visit[b]=1;
}
if(c>=0 && c<=100000 && visit[c]==0) {
queue.offer(new Node(c,next.step+1));
visit[c]=1;
}
}
}
return 0;
}
}
class Node{
int x;
int step;
Node(int x,int step){
this.x=x;
this.step=step;
}
}