본문 바로가기

Problem/BFS

[백준알고리즘] 1967번 숨바꼭질

https://www.acmicpc.net/problem/1697




























































dfs로 했다가 시간 초과나서 bfs로 풀어야 한다는 것을 계속 고친지 1시간만에 깨달음... 바보 멍청한 자식....


이따가 다시 bfs로 짜보아야 겠다...



<dfs로 짜서 실패했던 코드>


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
#include<iostream>
using namespace std;
 
int N, K;
int min_value = 10000;
bool visited[100001];
 
void dfs(int _N, int value)
{
    visited[_N] = true;
 
    if (_N == K) {
        if (min_value > value) min_value = value;
        return;
    }
 
    if (min_value > value + 1)
    {
        if (!visited[_N - 1&& _N - 1 >= 0 && _N - 1 <= 100000)
        {
            dfs(_N - 1, value + 1);
            visited[_N - 1= false;
        }
        if (!visited[_N + 1&& _N + 1 >= 0 && _N + 1 <= 100000)
        {
            dfs(_N + 1, value + 1);
            visited[_N + 1= false;
        }
        if (!visited[2 * _N] && 2 * _N >= 0 && 2 * _N <= 100000)
        {
            dfs(2 * _N, value + 1);
            visited[2 * _N] = false;
        }
    }
    return;
}
 
 
int main(void)
{
    cin >> N >> K;
 
    if (N > K) cout << N - K;
    else if (N == K)  cout << 0;
    else
    {
        dfs(N, 0);
        cout << min_value;
    }
    
    return 0;
}
cs




<bfs로 고쳐 성공한 코드>


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
#include<iostream>
#include<queue>
using namespace std;
 
int main(void)
{
    int N, K = 0;
    int value = 0;
    bool visited[100001= {false};
    queue<int> q;
 
    cin >> N >> K;
 
    if (N > K) cout << N - K;
    else if (N == K)  cout << 0;
    else
    {
        q.push(N);
        visited[N] = true;
 
        while (!q.empty())
        {
            int qsize = q.size();
 
            while (qsize--)
            {
                int index = q.front();
                q.pop();
 
                if (index == K) {
                    cout << value;
                    return 0;
                }
 
                if (!visited[index + 1&& index + 1 >= 0 && index + 1 <= 100000)
                {
                    q.push(index + 1);
                    visited[index + 1= true;
                }
                if (!visited[index - 1&& index - 1 >= 0 && index - 1 <= 100000)
                {
                    q.push(index - 1);
                    visited[index - 1= true;
                }
                if (!visited[2 * index] && 2*index >= 0 && 2*index <= 100000)
                {
                    q.push(2 * index);
                    visited[2 * index] = true;
                }
            }
            value++;
        }
    }
    return 0;
}
cs