STUDY/Algorithm

[백준] 9019 DSLR C++

sinawi95 2022. 2. 18. 08:52
728x90

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

 

9019번: DSLR

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

www.acmicpc.net

BFS로 진행했다.

#include<iostream>
#include<queue>
#include<string>
using namespace std;
#define D(s) ((2 * (s)) % 10000)
#define S(s) (((s) + 9999) % 10000)
#define L(s) (((s) % 1000) * 10 + ((s) / 1000))
#define R(s) (((s) / 10) + (((s) % 10) * 1000))

string bfs(int s, int e) {
	int cur, next, tmp;
	bool visit[10000] = { 0, };
	string cur_c, next_c;
	queue<pair<int, string>> q;
	q.push(make_pair(s, ""));
	while (!q.empty())
	{
		cur = q.front().first;
		cur_c = q.front().second;
		q.pop();
		if (cur == e)
			return cur_c;
		
		tmp = D(cur);
		if (!visit[tmp]) {
			visit[tmp] = true;
			q.push(make_pair(tmp, cur_c + "D"));
		}
		tmp = S(cur);
		if (!visit[tmp]){
			visit[tmp] = true;
			q.push(make_pair(tmp, cur_c + "S"));
		}
		tmp = L(cur);
		if (!visit[tmp]) {
			visit[tmp] = true;
			q.push(make_pair(tmp, cur_c + "L"));
		}
		tmp = R(cur);
		if (!visit[tmp]) {
			visit[tmp] = true;
			q.push(make_pair(tmp, cur_c + "R"));
		}
	}
	return "";
}

int main() {
	int t, i, s, e;
	string answer;
	cin >> t;
	for (i = 0; i < t; i++)
	{
		cin >> s >> e;
		cout << bfs(s, e) << '\n';
	}
	return 0;
}

 

파이썬으로 할때 같은 코드였지만 계속 메모리초과와 시간초과가 떠서 실패했다.