5373 큐빙
문제 링크
3
4051
2
2 0 0 0 0
415 425 534 342 253
3 1 1 1 1
00 01 02
10 11 12
20 21 22
0 : t(3t) r(5t) b(2t) l(4t)
1 : t(2b) r(5b) b(3b) l(4b)
2 : t(0b) r(5l) b(1t) l(4r)
3 : t(0t) r(4l) b(1b) l(5r)
4 : t(0l) r(2l) b(1l) l(3r)
5 : t(0r) r(3l) b(1r) l(2r)
ex) F+ -> 2번면 시계방향
t(0b) -> r(5l) -> b(1t) -> l(4r)
0 -> 5는 r과 t의 결합
0의 B영역 (20, 21, 22) -> 5의 L영역 (00, 10, 20)
5 -> 1는 b와 r의 결합
5의 L영역 (00, 10, 20) -> 1의 T영역 (02, 01, 00) **역전
1 -> 4는 l과 b의 결합
1의 T영역 (00, 01, 02) -> 4의 R영역 (02, 12, 22)
4 -> 0는 t와 l의 결합
4의 r영역 (02, 12, 22) -> 0의 B영역 (22, 21, 20)
좌우앞뒤면을 회전시 위, 아래 면의 순서 역전에 주의한다.
옮길면의 trbl과 옮겨질 면의 trbl의 비교를 통해 알 수 있다.
#include <bits/stdc++.h>
using namespace std;
char sideName[6] = { 'U', 'D', 'F', 'B', 'L', 'R' };
char dr[2] = { '+', '-' };
char cube[6][9];
// 6개의 면(0~5), {면, 점0, 점1, 점2}
int side_mapping[6][4][4] = {
{{3, 2, 1, 0}, {5, 2, 1, 0}, {2, 2, 1, 0}, {4, 2, 1, 0}},
{{3, 6, 7, 8}, {4, 6, 7, 8}, {2, 6, 7, 8}, {5, 6, 7, 8}},
{{0, 6, 7, 8}, {5, 0, 3, 6}, {1, 6, 7, 8}, {4, 8, 5, 2}},
{{0, 2 ,1, 0}, {4, 0, 3, 6}, {1, 2, 1, 0}, {5, 8, 5, 2}},
{{0, 0, 3, 6}, {2, 0, 3, 6}, {1, 8, 5, 2}, {3, 8, 5, 2}},
{{0, 8, 5, 2}, {3, 0, 3, 6}, {1, 0, 3, 6}, {2, 8, 5, 2}}
};
int self_rotate_mapping[9][2] = {
{0, 2}, {1, 5}, {2, 8}, {5, 7}, {8, 6}, {7, 3}, {6, 0}, {3, 1}, {4, 4}
};
pair<int, int> getSideIndexAndDirection(string data) {
int f, s = (data[1] == '-');
for (f = 0; f < 6; f++) {
if (data[0] == sideName[f])
break;
}
return make_pair(f, s);
}
void goBig(int side) {
char tmp[3];
int backupSide = side_mapping[side][0][0];
tmp[0] = cube[backupSide][side_mapping[side][0][1]];
tmp[1] = cube[backupSide][side_mapping[side][0][2]];
tmp[2] = cube[backupSide][side_mapping[side][0][3]];
for (int i = 0; i < 3; i++) {
int target_side = side_mapping[side][i][0];
int target_val1 = side_mapping[side][i][1];
int target_val2 = side_mapping[side][i][2];
int target_val3 = side_mapping[side][i][3];
int source_side = side_mapping[side][i + 1][0];
int source_val1 = side_mapping[side][i + 1][1];
int source_val2 = side_mapping[side][i + 1][2];
int source_val3 = side_mapping[side][i + 1][3];
cube[target_side][target_val1] = cube[source_side][source_val1];
cube[target_side][target_val2] = cube[source_side][source_val2];
cube[target_side][target_val3] = cube[source_side][source_val3];
}
int last_target_side = side_mapping[side][3][0];
int last_target_val1 = side_mapping[side][3][1];
int last_target_val2 = side_mapping[side][3][2];
int last_target_val3 = side_mapping[side][3][3];
cube[last_target_side][last_target_val1] = tmp[0];
cube[last_target_side][last_target_val2] = tmp[1];
cube[last_target_side][last_target_val3] = tmp[2];
}
void goSmall(int side) {
char tmp[3];
int backupSide = side_mapping[side][3][0];
tmp[0] = cube[backupSide][side_mapping[side][3][1]];
tmp[1] = cube[backupSide][side_mapping[side][3][2]];
tmp[2] = cube[backupSide][side_mapping[side][3][3]];
for (int i = 3; i > 0; i--) {
int target_side = side_mapping[side][i][0];
int target_val1 = side_mapping[side][i][1];
int target_val2 = side_mapping[side][i][2];
int target_val3 = side_mapping[side][i][3];
int source_side = side_mapping[side][i - 1][0];
int source_val1 = side_mapping[side][i - 1][1];
int source_val2 = side_mapping[side][i - 1][2];
int source_val3 = side_mapping[side][i - 1][3];
cube[target_side][target_val1] = cube[source_side][source_val1];
cube[target_side][target_val2] = cube[source_side][source_val2];
cube[target_side][target_val3] = cube[source_side][source_val3];
}
int last_target_side = side_mapping[side][0][0];
int last_target_val1 = side_mapping[side][0][1];
int last_target_val2 = side_mapping[side][0][2];
int last_target_val3 = side_mapping[side][0][3];
cube[last_target_side][last_target_val1] = tmp[0];
cube[last_target_side][last_target_val2] = tmp[1];
cube[last_target_side][last_target_val3] = tmp[2];
}
void rotate_side(int side, int direction) {
// clockWiseRotate(CKWR), counterClockWiseRotate(CCWR)
if (direction) {
goBig(side);
}
else {
goSmall(side);
}
}
void rotate_self(int side, int direction) {
int from = direction;
int to = !direction;
char temp[9];
for (int i = 0; i < 9; i++) {
int t_idx = self_rotate_mapping[i][to];
int f_idx = self_rotate_mapping[i][from];
temp[t_idx] = cube[side][f_idx];
}
for (int i = 0; i < 9; i++)
cube[side][i] = temp[i];
}
void rotate(string data) {
pair<int, int> info = getSideIndexAndDirection(data);
int side = info.first;
int direction = info.second;
rotate_self(side, direction);
rotate_side(side, direction);
}
void reset_cube() {
char color[6] = { 'w', 'y', 'r', 'o', 'g', 'b' };
for (int s = 0; s < 6; s++) {
for (int r = 0; r < 9; r++)
cube[s][r] = color[s];
}
}
int main() {
cin.tie(0);
ios::sync_with_stdio(0);
int tc, rtn;
string data;
cin >> tc;
while (tc--) {
reset_cube();
cin >> rtn;
while (rtn--) {
cin >> data;
rotate(data);
}
for (int i = 0; i < 9; i++) {
cout << cube[0][i];
if(!((i + 1) % 3))
cout << "\n";
}
}
}
댓글남기기