https://www.acmicpc.net/problem/9019
9019번: DSLR
문제 네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에 저장된 n을 다음과 같이 변환한다. n의 네 자릿수를 d1, d2, d3, d4라고 하자(즉 n = ((d1 × 10 + d2) × 10 + d3) × 10 + d4라고 하자) D: D 는 n을 두 배로 바꾼다. 결과 값이 9999 보다 큰 경
www.acmicpc.net
단순 BFS 문제였다. 현재 있는 경로에서 숫자들을 하나씩 탐색한 결과를 저장해두다가 내가 찾는 숫자가 나오면 종료하면 된다. BFS를 사용하니 방문한 곳은 재방문하지 않기 때문에 효율적인 탐색 결과나 나온다.
#include <iostream>
#include <string>
#include <queue>
using namespace std;
int n;
int num1, num2;
void bfs() {
queue <int> q; //탐색한 결과를 저장하는 공간
bool visit[10000]; //방문 여부 저장
string res[10000]; //방문한 결과들을 저장
int change; //현재 D,S,L,R을 한 결과
fill(&visit[0], &visit[10000], false); //모든 공간을 미방문 처리
//제일 처음 숫자를 방문처리하고 탐색한 결과에 저장
q.push(num1);
visit[num1] = true;
while (!q.empty()) {
int temp = q.front();
q.pop();
if (temp == num2) {
cout << res[temp] << '\n';
}
//D
change = temp * 2;
if (change > 9999) {
change = change % 10000;
}
if (!visit[change]) {
q.push(change);
res[change] = res[temp] + 'D';
visit[change] = true;
}
//S
change = temp - 1;
if (temp == 0) {
change = 9999;
}
if (!visit[change]) {
q.push(change);
res[change] = res[temp] + 'S';
visit[change] = true;
}
//L
change = (temp % 1000) * 10 + temp / 1000;
if (!visit[change]) {
q.push(change);
res[change] = res[temp] + 'L';
visit[change] = true;
}
//R
change = (temp % 10) * 1000 + (temp / 10);
if (!visit[change]) {
q.push(change);
res[change] = res[temp] + 'R';
visit[change] = true;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> num1 >> num2;
bfs();
}
}'백준' 카테고리의 다른 글
| 백준1654 - 랜선 자르기 (0) | 2020.01.16 |
|---|---|
| 백준9372 - 상근이의 여행 (0) | 2020.01.09 |
| 백준1669 - 멍멍이 쓰다듬기 (0) | 2019.12.29 |
| 백준1309 - 동물원 (0) | 2019.12.27 |
| 백준1544 - 사이클 단어 (0) | 2019.12.26 |