반응형
9019번: DSLR
네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에
www.acmicpc.net
문제 설명은 다음과 같다.
평범한 BFS 문제지만, 조건을 하나 정해줘서 경로가 끊겼다면 더 이상 탐색하지 않게 막아주는 분기가 필요하다.
- Visited 배열을 하나 생성해주자. 최대값은 10000이니 visited[10000]으로 선언.
- DSLR을 통해 한 번 방문한 문자열의 visited는 True로 처리해주고, 이후에 다시 방문한다면 걸러주자
- why? -> 이후에 방문한 것은 어차피 전에 방문했다면 그것보다 무조건 더 긴 DSLR 문자열을 가질테니 최솟값이 될 수 없다!
- Queue에서 계속 빼주면서, 각각의 D, S, L, R 값을 계산 후 큐에 다시 넣어준다.
- empty가 되거나, 찾고 있는 target 값이 등장한다면 break!
아래는 위 사고 구조를 그대로 구현한 C++ 코드이다.
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <cstring>
#define fastcpp ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
int test_case;
int current, target;
bool visited[10000];
void bfs(){
queue<pair<int,string>> q;
q.push({current,""});
while(!q.empty()){
int cur = q.front().first;
string DSLR = q.front().second;
q.pop();
if (cur==target) {
cout << DSLR << '\n';
return;
}
int DValue = (cur*2)%10000;
int SValue = (cur-1<0) ? 9999 : cur-1;
int LValue =(cur % 1000) * 10 + (cur / 1000);
int RValue = cur / 10 + (cur % 10) * 1000;
if (!visited[DValue]){
visited[DValue] = true;
q.push({DValue,DSLR+'D'});
}
if (!visited[SValue]){
visited[SValue] = true;
q.push({SValue,DSLR+'S'});
}
if (!visited[LValue]){
visited[LValue] = true;
q.push({LValue,DSLR+'L'});
}
if (!visited[RValue]) {
visited[RValue] = true;
q.push({RValue,DSLR+'R'});
}
}
}
int main() {
fastcpp;
cin >> test_case;
while(test_case>0){
test_case--;
cin >> current >> target;
memset(visited, false, sizeof(visited));
bfs();
}
return 0;
}
반응형
'백준 문제풀이 > 백준 Gold' 카테고리의 다른 글
백준 1916 - 최소비용 구하기 [C/C++] (0) | 2024.08.23 |
---|---|
백준 7662 - 이중 우선순위 큐 [C/C++] (0) | 2024.06.23 |
백준 1107 - 리모컨 [C/C++] (0) | 2023.11.07 |
백준 14500 - 테트로미노 [C/C++] BFS 알고리즘 (1) | 2023.11.06 |
백준 16928 - 뱀과 사다리 게임 [C/C++] BFS 알고리즘 (1) | 2023.11.05 |