当青训营遇上码上掘金—寻友之旅(Java)

55 阅读2分钟

当青训营遇上码上掘金

主题 3:寻友之旅

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。 步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1 公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)

请帮助小青通知小码,小青最快到达时间是多久? 输入: 两个整数 N 和 K 输出: 小青到小码家所需的最短时间(以分钟为单位)

题解:

题目要求求解小青最快到达的时间。结合题目,我想到的是用BFS求解。

首先定义一个结点类Node,记录当前地点及从N到改点所花费的时间

结合题目给出的变化条件:

  1. X-1,后退
  2. X+1,前进
  3. 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);
             }
 ​
         }
 }
 ​