그냥 가장 빠른 시간만 출력하는 문제였다면 쉬웠지만
경로까지 출력해야되기 때문에 좀 복잡하다.
BFS를 사용해야하는 문제.
경로는 구조체와 벡터를 이용하여 출력해야한다.
위의 방법도 한 방법이긴하나 from배열을 만들어서 어디서왔는지 저장한 다음
경로를 역순으로 벡터에 모두 넣고 역 출력하는 것이 가장 좋은 방법이다.
자꾸 시간초과가 뜨길래 편법을 썼다
N이 K보다 클때는 뒤로가는 방법밖에 없기 떄문에
그냥 포문돌려서 출력하니 해결됬다.
코드 (벡터를 이용하여 경로를 출력하는 방법)
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 69 70 | #include<stdio.h> #include<iostream> #include<vector> #include<queue> #include<algorithm> using namespace std; int dist[100001]; int from[100001]; bool check[100001]; queue<int>q; stack<int>trace; int main() { int n, k; cin >> n >> k; dist[n] = 0; check[n] = true; q.push(n); while (!q.empty()) { int now = q.front(); q.pop(); if (now + 1 <= 100000 && check[now + 1] == false) { check[now + 1] = true; dist[now + 1] = dist[now] + 1; from[now + 1] = now; q.push(now + 1); } if (now - 1 >= 0 && check[now - 1] == false) { check[now - 1] = true; dist[now - 1] = dist[now] + 1; from[now - 1] = now; q.push(now - 1); } if (now * 2 <= 100000 && check[now * 2] == false) { check[now * 2] = true; dist[now * 2] = dist[now] + 1; from[now * 2] = now; q.push(now * 2); } } cout << dist[k] << endl; int now = k; trace.push_back(k); while (now != n) { now = from[now]; trace.push_back(now); } reverse(trace.begin(), trace.end()); for (int i = 0; i < trace.size(); i++) { cout << trace[i] << " "; } } | cs |
코드 (구조체를 이용하여 경로를 출력하는 방법)
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #include<stdio.h> #include<iostream> #include<vector> #include<queue> using namespace std; bool check[100001]; struct DATA { int x; int step; vector<int>path; }; int main() { int n, k; queue<DATA>q; cin >> n >> k; check[n] = true; DATA s; s.x = n; s.step = 0; q.push(s); if (n <= k) { while (!q.empty()) { DATA d; d = q.front(); q.pop(); int now = d.x; int st = d.step; if (now == k) { cout << st << endl; d.path.push_back(k); for (int i = 0; i < d.path.size() - 1; i++) { if (d.path[i] != d.path[i + 1]) cout << d.path[i] << " "; } cout << k; break; } int a = now - 1; int b = now + 1; int c = now * 2; if (a >= 0 && a <= 100000 && check[a] == false) { check[a] = true; d.x = a; d.path.push_back(now); d.step = st + 1; q.push(d); } if (b >= 0 && b <= 100000 && check[b] == false) { check[b] = true; d.x = b; d.path.push_back(now); d.step = st + 1; q.push(d); } if (c >= 0 && c <= 100000 && check[c] == false) { check[c] = true; d.x = c; d.path.push_back(now); d.step = st + 1; q.push(d); } } } else { cout << n-k << endl; for (int i = n; i >= k; i--) { printf("%d ", i); } } } | cs |
'BOJ' 카테고리의 다른 글
백준 2589 / 보물섬 (0) | 2019.01.02 |
---|---|
백준 7569 / 토마토 (0) | 2019.01.02 |
백준 7562 / 나이트의 이동 (0) | 2019.01.01 |
백준 2468 / 안전 영역 (0) | 2019.01.01 |
백준 2583 / 영역 구하기 (0) | 2019.01.01 |