当青训营遇上码上掘金 这道题的思路是使用 BFS (广度优先搜索) 算法。
题目要求小青最快到达小码家的时间。因此,我们可以使用 BFS 算法从小青当前的位置向外扩展,找到小码家的最短时间。
在 BFS 中,我们可以用一个队列来存储当前正在处理的所有节点,每次从队列中取出第一个节点,并将它相邻的节点添加到队列中,直到找到小码家为止。
在这个算法中,每个节点需要存储它到达当前位置的步数,当找到小码家时,取出最小的步数即为结果。
最后,我们需要使用一个 visited 数组来记录每个节点是否已经被处理过,以避免环的出现。可以使用一个循环来实现 BFS,每次从队列中取出一个节点,然后对相邻的两个节点进行处理:步行到相邻节点 X-1 或 X+1,公交到相邻节点 2*X。
在步行时,如果 X-1 或 X+1 小于 0 或大于 K,说明不可达,无需添加到队列中;否则,如果它们尚未被处理过,则将它们添加到队列中并将它们的步数加 1。
在公交时,如果 2*X 小于 0 或大于 K,说明不可达,无需添加到队列中;否则,如果它尚未被处理过,则将它添加到队列中并将它的步数加 1。
一旦找到小码家,则可以立即停止 BFS 并返回结果。
以下是 Java 代码的实现: import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); sc.close(); System.out.println(minTimeToHome(n, k)); }
private static int minTimeToHome(int n, int k) {
Queue<Integer> queue = new LinkedList<>();
boolean[] visited = new boolean[100001];
int[] step = new int[100001];
queue.offer(n);
visited[n] = true;
step[n] = 0;
while (!queue.isEmpty()) {
int curr = queue.poll();
if (curr == k) {
return step[curr];
}
int next = curr + 1;
if (next >= 0 && next <= 100000 && !visited[next]) {
queue.offer(next);
visited[