소수를 유난히도 좋아하는 창영이는 게임 아이디 비밀번호를 4자리 ‘소수’로 정해놓았다. 어느 날 창영이는 친한 친구와 대화를 나누었는데:
그렇다. 그래서 여러분이 이 문제를 풀게 되었다. 입력은 항상 네 자리 소수만(1000 이상) 주어진다고 가정하자. 주어진 두 소수 A에서 B로 바꾸는 과정에서도 항상 네 자리 소수임을 유지해야 하고, ‘네 자리 수’라 하였기 때문에 0039 와 같은 1000 미만의 비밀번호는 허용되지 않는다.
첫 줄에 test case의 수 T가 주어진다. 다음 T줄에 걸쳐 각 줄에 1쌍씩 네 자리 소수가 주어진다.
각 test case에 대해 두 소수 사이의 변환에 필요한 최소 회수를 출력한다. 불가능한 경우 Impossible을 출력한다.
import java.util.*;
import java.io.*;
public class Main {
static int C, R;
static boolean[] prime;
public static void main (String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int T = Integer.parseInt(st.nextToken());
prime = new boolean[10000];
prime[0] = prime[1] = true;
for(int i = 2; i <= Math.sqrt(10000); i++) {
if (prime[i]) continue;
for (int j = i+i; j < 10000; j += i)
prime[j] = true;
}
while(T-- > 0) {
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
BFS(start, end);
}
}
public static void BFS(int start, int end) {
Queue<Integer> q = new LinkedList<>();
boolean[] visited = new boolean[10000];
int[] cnt = new int[10000];
q.add(start);
visited[start] = true;
while(!q.isEmpty()) {
int n = q.poll();
for (int i = 0; i < 4; i++)
for (int j = 0; j <= 9; j++) {
if (i == 0 && j == 0)
continue;
int num = change(i, j, n);
if (!prime[num] && !visited[num]) {
q.add(num);
visited[num] = true;
cnt[num] = cnt[n] + 1;
}
}
}
System.out.println(cnt[end]);
}
public static int change(int i, int j, int num) {
StringBuilder sb = new StringBuilder(String.valueOf(num));
sb.setCharAt(i, (char)(j+'0'));
return Integer.parseInt(sb.toString());
}
}