import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
public class baekjoon13913 {
public static void main(String[] args) {
// 수빈이와 동생의 숨바꼭질 (동생을 찾아라)
// 수빈이는 +1, -1, *2 로 이동을 할 수 있다.
// 수빈이가 동생을 찾는데 걸리는 최소시간과, 최단경로를 나타내라
// 4, 5, 6, 7 경로로 이동하였을 때
// 최단 경로를 구하는 방법
// dist[5] = 4
// dist[6] = 5
// dist[7] = 6
// dist[4] = 0
// stack에 넣어주고 stack에서 하나씩 프린트를 해주자
// 최단 시간을 구하는 방법
// bfs를 이용해서 구하자
int max = 1000000;
int[] time = new int[max];
int[] dist = new int[max];
boolean[] visit = new boolean[max];
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int y = sc.nextInt();
visit[x] = true;
Queue<Integer> q = new LinkedList<>();
q.add(x);
while (!q.isEmpty()) {
int n = q.remove();
if (n == y) {
break;
}
// n+1 로 이동했을 때
if (n + 1 < max && visit[n + 1] == false) {
visit[n + 1] = true;
time[n + 1] = time[n] + 1;
dist[n + 1] = n;
q.add(n + 1);
}
if (n - 1 >= 0 && visit[n - 1] == false) {
visit[n - 1] = true;
time[n - 1] = time[n] + 1;
dist[n - 1] = n;
q.add(n - 1);
}
if (2 * n < max && visit[2 * n] == false) {
visit[2 * n] = true;
time[2 * n] = time[n] + 1;
dist[2 * n] = n;
q.add(2 * n);
}
}
Stack<Integer> stack = new Stack<>();
stack.add(y);
int tempY = y;
while (tempY != x) {
tempY = dist[tempY];
stack.add(tempY);
}
System.out.println(time[y]);
while (!stack.isEmpty()) {
int temp = stack.pop();
System.out.print(temp + " ");
}
System.out.println();
}
}
'알고리즘 > BFS & DFS' 카테고리의 다른 글
[JAVA] 백준 13549번: 숨바꼭질 3 (0) | 2021.07.18 |
---|---|
[JAVA] 백준 14226번: 이모티콘 (0) | 2021.07.17 |
[JAVA] 백준 1697번: 숨바꼭질 (0) | 2021.07.15 |
BFS (0) | 2021.07.15 |
[JAVA] 백준 2146번: 다리 만들기 (0) | 2021.07.14 |