맨 처음에는 문제를 읽자마자 BFS로 풀면 되네~ 했습니다. 그런데, BFS코드를 짜다가 문득 이런 생각을 하게 됐습니다.
이런 생각을 하고 나니
라고 그리디를 생각하게 됐습니다. 너무 쉽다고 생각하며 코드를 다 짜고, 예제 입력을 돌려보니 정답도 나와서 제출하려고 했던 순간, 갑자기 다시 깨닫게 된 점이 있습니다.
아... 그리디가 아니었구나. 그냥 BFS로 풀어야 되는구나 라고 처음의 생각으로 돌아와서 BFS로 풀게 됐습니다.
package bj.solvedac.class3;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class BJ16928 {
private static final BufferedReader br = new BufferedReader(
new InputStreamReader(System.in), 1<<10
);
private static final int[] board = new int[101];
private static final boolean[] visited = new boolean[101];
public static void main(String[] args) throws Throwable {
init();
br.close();
System.out.println(bfs());
}
private static void init() throws Throwable {
for (int n = 1; n <= 100; n++) {
board[n] = n;
}
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
final int ladderSnakes = Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken());
for (int i = 0; i < ladderSnakes; i++) {
st = new StringTokenizer(br.readLine(), " ");
final int from = Integer.parseInt(st.nextToken());
final int to = Integer.parseInt(st.nextToken());
board[from] = to;
}
}
private static int bfs() {
Deque<int[]> q = new LinkedList<>();
q.offer(new int[]{1, 0});
visited[0] = true;
while (!q.isEmpty()) {
int[] cur = q.poll();
for (int dice = 1; dice <= 6; dice++) {
int to = cur[0] + dice;
if (to == 100) {
return cur[1] + 1;
}
to = board[to];
if (visited[to]) {
continue;
}
visited[to] = true;
q.offer(new int[]{to, cur[1] + 1});
}
}
throw new RuntimeException("UNREACHABLE CODE");
}
}