Notice
Recent Posts
Recent Comments
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

[백준/BOJ] 9019 DSLR 본문

Programming/BOJ

[백준/BOJ] 9019 DSLR

he1fire 2020. 9. 19. 01:41
728x90

문제 : 9019 DSLR

 

9019번: DSLR

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

www.acmicpc.net

두 수가 주어졌을 때 어떤 행동을 통해 첫 번째 수를

두 번째 수로 바꾸는 최소 횟수와 그 경로를 출력하는 문제이다.

BFS를 이용해 최소 횟수를 구하면서, 가는 경로를 저장하는

문자열 배열도 만들어 추가로 저장해주면 된다.

나 같은 경우에는 그냥 pair를 활용해 최소 횟수와 경로를

저장하는 배열을 한데 묶어 저장했다. 


Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
typedef pair<ll,string> pls;
ll N, M;
string BFS(){
    string ret;
    vector<pls> arr(10005);
    queue<ll> q;
    arr[N].first=1;
    q.push(N);
    while (!q.empty()){
        ll x=q.front();
        q.pop();
        if (x==M){
            ret=arr[M].second;
            break;
        }
        ll dir[4]={(x*2)%10000, ((x+10000)-1)%10000, (x%1000)*10+x/1000, (x%10)*1000+x/10};
        char c[4]={'D','S','L','R'};
        for (int i=0;i<4;i++){
            if (arr[dir[i]].first==0){
                arr[dir[i]].first=1;
                arr[dir[i]].second=arr[x].second+c[i];
                q.push(dir[i]);
            }
        }
    }
    return ret;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll T;
    cin >> T;
    while (T--){
        cin >> N >> M;
        cout << BFS() << "\n";
    }
    return 0;
}
728x90

'Programming > BOJ' 카테고리의 다른 글

[백준/BOJ] 1058 친구  (0) 2020.09.19
[백준/BOJ] 2166 다각형의 면적  (1) 2020.09.19
[백준/BOJ] 5525 IOIOI  (0) 2020.09.19
[백준/BOJ] 1780 종이의 개수  (0) 2020.09.19
[백준/BOJ] 1213 팰린드롬 만들기  (0) 2020.09.18
Comments