题意:
FJ要抓奶牛。
开始输入N(FJ的位置)K(奶牛的位置)。
FJ有三种移动方法:1、向前走一步,耗时一分钟。
2、向后走一步,耗时一分钟。
3、向前移动到当前位置的两倍N*2,耗时一分钟。
问FJ抓到奶牛的最少时间。PS:奶牛是不会动的。
才开始看到这个题目 还真不知道用bfs题目来做 看到分类在搜索里面的 看了下题解 秒懂 哈哈
思路:1、如果FJ不在奶牛后面,那么他只有一步步往后移动到奶牛位置了,即N>=K时,输出N-K即可。
2、否则bfs
package 简单搜索;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
/**
* Created by user on 2017/8/22.
*/
public class poj3278 {
static int maxn=100001;
static boolean vis[]=new boolean[maxn];
static int step[]=new int[maxn];//用来存储当前到达的地方所需要的步数
static Queue<Integer> queue=new LinkedList<Integer>();
public static void main(String args[]){
Scanner scanner=new Scanner(System.in);
int n,k;
n=scanner.nextInt();
k=scanner.nextInt();
Arrays.fill(vis,false);
Arrays.fill(step,0);
if(n>=k){
System.out.println((n-k));
}else{
// if(!queue.isEmpty()){
// queue.clear();
// }
System.out.println(bfs(n,k));
}
}
private static int bfs(int n,int k) {
queue.offer(n);
vis[n]=true;
step[n]=0;
int to;
while (queue.size()!=0){
int from=queue.poll();
for(int i=0;i<3;i++){//三种移动情况
if(i==0){
to=from-1;//后退一步
}else if(i==1){
to=from+1;//前进一步
}else{
to=from*2;//到达两倍距离
}
if(to<0||to>=maxn){
continue;
}
if(!vis[to]){
queue.offer(to);
step[to]=step[from]+1;//到达地方等于之前出发的地方加上1
vis[to]=true;
}
if(to==k){//如果到达 就返回
return step[to];
}
}
}
return 0;
}
}