<링크>
https://www.acmicpc.net/problem/1963
<소스코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #include<stdio.h> #include<vector> #include<queue> #include<string> #include<string.h> using namespace std; void eratos(); void bfs(int,int); vector<int> isPrime(10000,1); int main() { eratos(); int T,N,K; scanf("%d", &T); while (T--) { scanf("%d%d", &N, &K); bfs(N,K); } } void bfs(int S,int D) { queue<int> q; vector<int> isVisited(10000, 0); q.push(S); int depth = 0; while (!q.empty()) { int s = q.size(); for (int i = 0; i < s; ++i) { int c = q.front(); q.pop(); if (c == D) { printf("%d\n", depth); return; } string num = to_string(c); for (int j = 0; j < 4; ++j) { string tmp = string(num); for (int k = '0'; k <= '9'; ++k) { tmp[j] = k; int to = stoi(tmp); if (isPrime[to] && !isVisited[to] && to >= 1000) { isVisited[to] = 1; q.push(to); } } } } ++depth; } printf("Impossible\n"); return; } void eratos() { for (int i = 2; i <= 100; ++i) { if(isPrime[i]) for (int j = i * 2; j <= 9999; j += i) { isPrime[j] = 0; } } } | cs |
<풀이>
각 자리마다 번호를 0~9까지 바꿔가면서 탐색한다.
소수이면서 && 방문 안했고 && 1000이상일때만 큐에 넣는다.
한 자리만 번호를 바꿔야하므로 구현하기 귀찮아서 string을 이용했다.
소수인지 판가름하기도 좀더 빠르게 하려고 에라토스테네스의 체를 이용했다.
1. 그냥다 소수라고 가정하고 배열 만듬 (전부 소수라고 체크)
2. 2부터 루트N까지 소수라고 체크되어있으면 배수는 다 제거
'알고리즘 풀이 > BFS' 카테고리의 다른 글
백준 2251 물통 (0) | 2018.08.01 |
---|---|
백준 1525 퍼즐 (0) | 2018.07.31 |
백준 9019 DSLR (0) | 2018.07.31 |
백준 1697 숨바꼭질 (1) | 2018.07.29 |
KOITP 보물찾기 (0) | 2018.07.23 |