https://www.acmicpc.net/problem/13549
N에 있고, 동생은 점 K에 있다.X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다.2*X의 위치로 이동하게 된다.BFS를 활용한 문제
1697번: 숨바꼭질이랑 굉장히 유사한 문제입니다.
다른 점이 하나 있다면, 여기서 순간이동은 0초 후에 이동을 한다는 것입니다.
이 점을 잘 고려해서 문제를 풀면 어렵지 않게 해결할 수 있습니다.
private static void bfs() {
visited = new int[100001];
Arrays.fill(visited, -1);
Queue<Integer> queue = new ArrayDeque<>();
queue.add(n); // 시작 좌표 삽입
visited[n] = 0; // 시작 지점 방문 처리
while (!queue.isEmpty()) {
int cur = queue.poll();
if (cur == k) return; // 현재 좌표가 도착 지점이라면 종료
if (cur * 2 <= 100000 && visited[cur * 2] == -1) {
visited[cur * 2] = visited[cur];
queue.add(cur * 2);
}
if (cur - 1 >= 0 && visited[cur - 1] == -1) {
visited[cur - 1] = visited[cur] + 1;
queue.add(cur - 1);
}
if (cur + 1 <= 100000 && visited[cur + 1] == -1) {
visited[cur + 1] = visited[cur] + 1;
queue.add(cur + 1);
}
}
Deque를 이용하시면 됩니다. (addFirst)import java.util.*;
import java.io.*;
public class Main_13549 {
static int n, k;
static int[] visited;
private static void bfs() {
visited = new int[100001];
Arrays.fill(visited, -1);
Queue<Integer> queue = new ArrayDeque<>();
queue.add(n);
visited[n] = 0;
while (!queue.isEmpty()) {
int cur = queue.poll();
if (cur == k) return;
if (cur * 2 <= 100000 && visited[cur * 2] == -1) {
visited[cur * 2] = visited[cur];
queue.add(cur * 2);
}
if (cur - 1 >= 0 && visited[cur - 1] == -1) {
visited[cur - 1] = visited[cur] + 1;
queue.add(cur - 1);
}
if (cur + 1 <= 100000 && visited[cur + 1] == -1) {
visited[cur + 1] = visited[cur] + 1;
queue.add(cur + 1);
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
bfs();
System.out.println(visited[k]);
}
}