ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [9019] DSLR
    BOJ 2021. 10. 2. 11:03

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

     

    9019번: DSLR

    네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에

    www.acmicpc.net

    <문제>

    L 연산은 cur%1000*10으로 d2, d3, d4 3자리를 구성한 뒤 cur/1000을 더해주어서 구현한다.

    R연산도 L연산과 마찬가지로 구현해주면 되겠다.

    출력해야하는 값, 즉 명령어의 순서를 파악하기 위해서

    현재 정점을 {현재 숫자(int), 명령어의 순서(string)}으로 구성했다.

     

    <소스코드>

    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
    #include <bits/stdc++.h>
    using namespace std;
    int t, a, b;
    bool _visit[10000];
    int main(void) {
        cin >> t;
        while (t--) {
            cin >> a >> b;
            queue<pair<intstring>> q;
            q.push({a, ""});
            memset(_visit, falsesizeof(_visit));
            _visit[a] = true;
            while (!q.empty()) {
                pair<intstring> cur = q.front();
                q.pop();
                if (cur.first == b) {
                    cout << cur.second << '\n';
                    break;
                }
                int D = cur.first * 2 % 10000;
                if (_visit[D] == false) {
                    _visit[D] = true;
                    q.push({D, cur.second + "D"});
                }
                int S = cur.first - 1;
                if (S == -1) S = 9999;
                if (_visit[S] == false) {
                    _visit[S] = true;
                    q.push({S, cur.second + "S"});
                }
                int L = (cur.first % 1000* 10 + (cur.first / 1000);
                if (_visit[L] == false) {
                    _visit[L] = true;
                    q.push({L, cur.second + "L"});
                }
                int R = 1000 * (cur.first % 10+ cur.first / 10;
                if (_visit[R] == false) {
                    _visit[R] = true;
                    q.push({R, cur.second + "R"});
                }
            }
        }
        return 0;
    }
    cs

     

    'BOJ' 카테고리의 다른 글

    [20056] 마법사 상어와 파이어볼  (0) 2021.10.02
    [1261] 알고스팟  (0) 2021.10.02
    [1697] 숨바꼭질  (0) 2021.10.01
    [9012] 괄호  (0) 2021.10.01
    [4344] 평균은 넘겠지  (0) 2021.10.01

    댓글