当青训营遇上码上掘金
主题 3:寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。 步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1 公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久? 输入: 两个整数 N 和 K 输出: 小青到小码家所需的最短时间(以分钟为单位)
题解:
题目要求求解小青最快到达的时间。结合题目,我想到的是用BFS求解。
首先定义一个结点类Node,记录当前地点及从N到改点所花费的时间
结合题目给出的变化条件:
- X-1,后退
- X+1,前进
- 2X,公交
采用BFS进行解题。
首先往队列中压入当前结点,然后进行循环,取出队列中的元素,然后对这个元素进行加1、减一和当前距离x2的操作,并且在该结点已用时间的基础上加1,然后判断处理后的距离是否等于目标距离。如果等于,则直接输出所花费的时间,如果不等于,则将记录三个不同变化的结点压入队列中,进行下一次循环遍历,直到得出结果。由于变化条件中有减一的操作,所以可通过判断当前距离是否大于0来进行剪枝,优化代码。
完整代码实现如下:
import java.util.*;
public class Main {
public static class Node{
int s;
int t;
}
public static void main(String[] args) {
// Scanner scan=new Scanner(System.in);
// String[] s=scan.nextLine().split(" ");
// scan.close();
// int N=Integer.parseInt(s[0]);
// int K=Integer.parseInt(s[1]);
int N=2;
int K=10;
Queue<Node> qu=new LinkedList<>();
Node node=new Node();
node.s=N;
node.t=0;
//找最短路径
qu.offer(node);
int res=0;
while(!qu.isEmpty()){
Node x=qu.poll();
Node a=new Node();
Node b=new Node();
Node c=new Node();
if(x.s<0){
continue;
}
a.s=x.s+1;
b.s=x.s-1;
c.s=x.s*2;
a.t=x.t+1;
b.t=x.t+1;
c.t=x.t+1;
if(a.s==K){
System.out.println("从"+N+"到"+K+"所需时间为:"+a.t+"min");
break;
}
if(b.s==K){
System.out.println("从"+N+"到"+K+"所需时间为:"+b.t+"min");
break;
}
if(c.s==K){
System.out.println("从"+N+"到"+K+"所需时间为:"+c.t+"min");
break;
}
qu.offer(a);
qu.offer(b);
qu.offer(c);
}
}
}