Be a developer

백준 13549 숨바꼭질 3 본문

알고리즘

백준 13549 숨바꼭질 3

중국고대사 2019. 4. 8. 00:11

bfs는 모든 가중치가 1일 때 가능하다.

앞서 풀었던 숨바꼭질 문제는 수빈이가 이동할 때 모두 1초가 걸렸기 때문에 가능했다.

하지만 이번 문제는 0초에 이동할 수 있어서 가중치가 0인 경우가 있다.

 

원래 bfs는 queue에 넣는 건데, 다 가중치가 1이기 때문에 거리가 1일 때, 거리가 2일 때 차곡차곡 쌓인다.
하지만 가중치가 다르면 꺼냈을 때 값이 뒤죽박죽이 된다. 

이럴 경우에 queue를 여러 개 사용해서 푼다.

즉, 0초 일 때 넣을 queue와 1초 일 때 넣을 queue 총 2개를 사용해서 문제를 푼다.

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
#include <iostream>
#include <queue>
#include <deque>
using namespace std;
bool c[1000000];
int d[1000000];
int MAX = 1000000;
int main() {
    int n, m;
    cin >> n >> m;
    c[n] = true;
    d[n] = 0;
    queue<int> q;
    queue<int> next_queue;
    q.push(n);
    while (!q.empty()) {
        int now = q.front();
        q.pop();
        if (now*2 < MAX) {
            if (c[now*2== false) {
                q.push(now*2);
                c[now*2= true;
                d[now*2= d[now];
            }
        }
        if (now-1 >= 0) {
            if (c[now-1== false) {
                next_queue.push(now-1);
                c[now-1= true;
                d[now-1= d[now] + 1;
            }
        }
        if (now+1 < MAX) {
            if (c[now+1== false) {
                next_queue.push(now+1);
                c[now+1= true;
                d[now+1= d[now] + 1;
            }
        }
        if (q.empty()) {
            q = next_queue;
            next_queue = queue<int>();
        }
    }
    cout << d[m] << '\n';
    return 0;
}
cs

'알고리즘' 카테고리의 다른 글

백준 2206 벽 부수고 이동하기  (0) 2019.04.08
백준 1261 알고스팟  (0) 2019.04.08
백준 14226 이모티콘  (0) 2019.04.07
백준 1697 숨바꼭질  (0) 2019.04.07
백준 7576 토마토  (0) 2019.04.07
Comments