Algorithm
[Algo] 백준 12761 돌다리 JAVA
조핑구
2024. 5. 8. 15:24
문제 바로가기 : https://www.acmicpc.net/problem/12761
메모리 : 20352KB
시간 : 172ms
언어 : Java 11
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static class Node {
int idx, cnt;
Node(int idx, int cnt) {
this.idx = idx;
this.cnt = cnt;
}
}
public static <T> void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int ans = 0;
int[] vector = { 1, -1, A, -1 * A, B, -1 * B };
boolean[] check = new boolean[100001];
Queue<Node> q = new LinkedList<>();
q.add(new Node(N, 0));
while (!q.isEmpty()) {
Node node = q.poll();
if (node.idx == M) {
ans = node.cnt;
break;
}
for (int k = 0; k < 6; k++) {
if (node.idx + vector[k] >= 0 && node.idx + vector[k] <= 100000 && !check[node.idx + vector[k]]) {
check[node.idx + vector[k]] = true;
q.add(new Node(node.idx + vector[k], node.cnt + 1));
}
}
if (node.idx * A <= 100000 && !check[node.idx * A]) {
check[node.idx * A] = true;
q.add(new Node(node.idx * A, node.cnt + 1));
}
if (node.idx * B <= 100000 && !check[node.idx * B]) {
check[node.idx * B] = true;
q.add(new Node(node.idx * B, node.cnt + 1));
}
}
System.out.println(ans);
}
}