Search
Duplicate

DSLR

주차
19
문제번호
9019
언어
C++
티어
골드
유형
BFS
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties

Memo

로직 설명

만들 수 있는 값을 모두 만들어 봅니다.
BFS 특성을 이용합니다. 방문 했던 값이면, 현재까지 DSLR 로직을 적용해서 온 것보다 작거나 같기 때문에 다시 방문하지 않습니다.
int (*fp[4])(int);
C
복사
함수 포인터 배열을 사용해 보았습니다.

Code

제출 날짜

@5/5/2021

메모리

2296 KB

시간

3012 ms
#include <iostream> #include <queue> #include <string> #include <cmath> #include <cstring> #define endl "\n" int T, A, B; std::queue<std::pair<std::string, int> > q; bool visited[10001]; const char op[4] = {'D', 'S', 'L', 'R'}; int (*fp[4])(int); void io_faster() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); } inline int D(int a) { return (a * 2 % 10000); } inline int S(int a) { return (a == 0 ? 9999 : a - 1); } inline int L(int a) { return (((a / 1000) + (a * 10)) % 10000); } inline int R(int a) { return ((a % 10) * 1000 + a / 10); } void input() { io_faster(); std::cin >> T; fp[0] = D; fp[1] = S; fp[2] = L; fp[3] = R; } inline void bfs() { std::string qs, n_s; int val, n_val; q = std::queue<std::pair<std::string, int> > (); std::memset(visited, 0, sizeof(visited)); q.push({"", A}); while (!q.empty()) { qs = q.front().first; val = q.front().second; q.pop(); for (int i = 0 ; i < 4 ; i++) { n_val = fp[i](val); if (n_val == B) { std::cout << qs + op[i] << endl; return ; } if (visited[n_val]) continue; visited[n_val] = 1; n_s = qs + op[i]; q.push({n_s, n_val}); } } } inline void solve() { std::cin >> A >> B; bfs(); } int main() { input(); while (T--) solve(); return (0); }
C++
복사