ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 9019 :: DSLR
    알고리즘/BOJ(C++) 2018. 7. 2. 22:58
    반응형

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


    얘도 BFS문제입니다!


    앞으로 한동안은 미뤄놨던? 어려운 BFS문제들을 다 풀어서 끝내려고합니당...


    이번주 scpc 2차라서 좀 다양한 못접해본 문제들 풀어야 하긴 하는데 ㅠ 몬가 이제와서 새로운 개념 공부해서 풀기 좀 늦은것 같기도하고...


    암튼 잡소리 치우고


    이문제도 너무 전형적인 bfs문제인데 여기서는 이제 다른 bfs문제랑 다른게 현재 탐색중인 지점이 어디서왔는지를 나타내는것(from배열 이용) 뿐만 아니라 그 지점으로 올때 사용된 방법(how)도 기록을 해주어야 한다는 점 입니다!


     L과 R구하는데 실수만 안하면 하핳...금방 풀수있는 문제입니다

    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
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    #include <iostream>
    #include <string>
    #include <queue>
    #include <stack>
    using namespace std;
     
    bool check[10001];
    int from[10001];
    char how[10001];
     
    int L(int i)
    {
        int temp = i % 1000;
        int front = i / 1000;
        int L = temp * 10 + front;
        return L;
    }
     
    int R(int i)
    {
        int last = i % 10;
        int temp = i / 10;
        int R = last * 1000 + temp;
        return R;
    }
     
    int main()
    {
        std::ios::sync_with_stdio(false);
        cin.tie(NULL);
     
        int t;
        cin >> t;
        while (t--)
        {
            int a, b;
            cin >> a >> b;
            
            queue<int> q;
            q.push(a);
            check[a] = true;
            while (!q.empty())
            {
                int now = q.front();
                q.pop();
     
                if (now == b)
                    break;
                
                if (check[(now * 2) % 10000== false)
                {
                    int next = (now * 2) % 10000;
                    q.push(next);
                    check[next] = true;
                    from[next] = now;
                    how[next] = 'D';
                }//D의 경우
                if (now == 0)
                {
                    if (check[9999== false)
                    {
                        int next = 9999;
                        q.push(next);
                        check[next] = true;
                        from[next] = now;
                        how[next] = 'S';
                    }
                }
                else if (check[now - 1== false)
                {
                    int next = now - 1;
                    q.push(next);
                    check[next] = true;
                    from[next] = now;
                    how[next] = 'S';
                }//S인 경우, 0일때 따로 예외처리
            
                int l = L(now);//L연산 결과 만들기
     
                if (check[l] == false)
                {
                    int next = l;
                    q.push(next);
                    check[next] = true;
                    from[next] = now;
                    how[next] = 'L';
                }
     
                int r = R(now);
                if (check[r] == false)
                {
                    int next = r;
                    q.push(next);
                    check[next] = true;
                    from[next] = now;
                    how[next] = 'R';
                }
                
     
     
            }
     
            stack<char> s;
     
            while (a != b)
            {
                s.push(how[b]);
                b = from[b];
            }
            
            while (!s.empty())
            {
                cout << s.top();
                s.pop();
            }
            cout << '\n';
     
            for (int i = 0; i <= 10000; i++)
            {
                check[i] = false;
            }
        }
    }
    cs




    반응형

    '알고리즘 > BOJ(C++)' 카테고리의 다른 글

    [BOJ] 1202 :: 보석 도둑  (0) 2018.07.24
    [BOJ] 14226 :: 이모티콘  (0) 2018.07.03
    [BOJ] 1377 :: 버블 소트  (0) 2018.07.01
    [BOJ] 4963 :: 섬의 개수  (0) 2018.06.20
    [BOJ] 1676 :: 팩토리얼 0의 개수  (0) 2018.06.19

    댓글

Designed by Tistory.