์๊ฐ์ด๊ณผ๋ก ์ธํด ๊ฝค๋ ๊ณ ์ํ๋ ๋ฌธ์ , BFS๋ฅผ ์ด๋ ๊ฒ๋ ํ์ฉํ ์ ์๊ตฌ๋๋ผ๋ ์๊ฐ์ด ๋๋ ๋ฌธ์ ์๋ค.
์ด ๋ฌธ์ ๋ A
๊ฐ B
๊ฐ ๋ ๋ ๊น์ง ์ฌ์ฉ๋๋ ์ปค๋งจ๋๋ฅผ ์์๋ด๋ ๋ฌธ์ ์ด๋ค.
D: n์ 2๋ฅผ ๊ณฑํ ํ 10000์ผ๋ก ๋๋ ๋๋จธ์ง ๊ฐ
S: n์์ 1์ ๋บ ๊ฐ, ๋ง์ฝ 0๋ณด๋ค ์์์ง๋ค๋ฉด 9999
L: n์ ๊ฐ ์๋ฆฟ์๋ฅผ ์ผ์ชฝ์ผ๋ก ํ์
R: n์ ๊ฐ ์๋ฆฟ์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์
์ด ๋ ์ฌ์ฉ๋๋ ์ปค๋งจ๋๋ ์์ 4๊ฐ์ ๊ฐ๋ค.
์ด ๋ฌธ์ ๋ ํ์ฌ ๋๋ฒ์์ 4๊ฐ์ง์ ์ปค๋ฉ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๊ฐ์ ์ฐพ์๋ด๊ณ ์ปค๋ฉ๋๋ฅผ ๋ํด์ฃผ๋ ์์ผ๋ก ๊ตฌํํ ์ ์๋ ๋ฌธ์ ์ด๋ค. ๋ฐ๋ผ์ ๊ทธ๋ํ ํ์ ๋ฌธ์ ๋ผ๊ณ ํ๋จํ์๋ค.
int L(int origin){
int temp = origin;
int ten = pow(10, digit(origin));
temp /= ten;
return (origin - temp * ten) + temp;
}
int R(int origin){
int d = digit(origin);
int temp = origin % 10;
origin /= 10;
return origin + temp * pow(10, d);
}
๋ด๊ฐ ์ฒ์์ ๊ตฌํํ L๊ณผ R์ ๊ฐ์ ๊ตฌํ๋ ํจ์์ด๋ค. Lํจ์๋ฅผ ์์๋ก ๋ค๋ฉด ์ค๋ฅธ์ชฝ ๊ฐ์ ์ผ์ชฝ์ผ๋ก ๋ณด๋ด๊ธฐ ์ํ์ฌ origin์ ์๋ฆฟ์๋ฅผ ๊ตฌํด origin์ ์ค๋ฅธ์ชฝ ๊ฐ์ ๋ด๋ temp๋ณ์๋ฅผ ๋ง๋ค์ด origin์ ๋ํ ํ origin์ ์ค๋ฅธ์ชฝ ๊ฐ์ ๋นผ์ฃผ์๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ๋ด๊ฐ ์๋ชป ์๊ฐํ ๋ถ๋ถ์ n์ ํญ์ d1
d2
d3
d4
4์๋ฆฌ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค๋ ๊ฒ์ด๋ค.
n = 123 ( 0 1 2 3 )
L์ฐ์ฐ -> 1230
R์ฐ์ฐ -> 3012
ํด๋น ๋ถ๋ถ์ ๋ง์กฑํ๋๋ก ์์์ ์์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
int L(int origin){
return (origin % 1000) * 10 + (origin / 1000);
}
int R(int origin){
return origin / 10 + (origin % 10) * 1000;
}
#include<iostream>
#include<queue>
using namespace std;
int D(int origin);
int S(int origin);
int L(int origin);
int R(int origin);
void check_num(int next, queue<pair<int, string>> &q, bool* check, string cmd){
if(check[next] == true)
return;
check[next] = true;
q.push({ next, cmd });
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t;
cin >> t;
while(t--){
int a;
int b;
bool check[10001] = {};
cin >> a >> b;
queue<pair<int, string>> q;
q.push({ a, "" });
check[a] = true;
while(!q.empty()){
pair<int, string> node = q.front();
q.pop();
if(node.first == b){
cout << node.second << "\n";
break;
}
check_num(D(node.first), q, check, node.second + "D");
check_num(S(node.first), q, check, node.second + "S");
check_num(L(node.first), q, check, node.second + "L");
check_num(R(node.first), q, check, node.second + "R");
}
}
}
int D(int origin){
return (origin * 2) % 10000;
}
int S(int origin){
return (origin - 1 >= 0 ? origin - 1 : 9999);
}
int L(int origin){
return (origin % 1000) * 10 + (origin / 1000);
}
int R(int origin){
return origin / 10 + (origin % 10) * 1000;
}
๋ง์ด ๋์์ด ๋์์ต๋๋ค.