Problem Solving/BOJ
[BOJ] #5373 _ 큐빙
Grini
2019. 10. 20. 22:20
[큐빙] https://www.acmicpc.net/problem/5373
5373번: 큐빙
문제 루빅스 큐브는 삼차원 퍼즐이다. 보통 루빅스 큐브는 3×3×3개의 작은 정육면체로 이루어져 있다. 퍼즐을 풀려면 각 면에 있는 아홉 개의 작은 정육면체의 색이 동일해야 한다. 큐브는 각 면을 양방향으로 90도 만큼 돌릴 수 있도록 만들어져 있다. 회전이 마친 이후에는, 다른 면을 돌릴 수 있다. 이렇게 큐브의 서로 다른 면을 돌리다 보면, 색을 섞을 수 있다. 이 문제에서는 루빅스 큐브가 모두 풀린 상태에서 시작한다. 윗 면은 흰색, 아랫 면은 노란
www.acmicpc.net
엄청나게 귀찮은 시뮬레이션 문제이다.
큐브가 돌아가는 방식대로 회전시킨 후, 최종적으로 제일 윗면의 색을 출력하는 문제이다.
큐브가 돌아갈 때 위치를 파악하여 하드코딩하였다.
사소한 실수를 많이해서 시간이 꽤 오래 걸렸다.;;
[ 소스 코드 ]
#include <cstdio>
#include <algorithm>
#define U 0
#define B 1
#define L 2
#define R 3
#define F 4
#define D 5
using namespace std;
char cube[6][3][3];
char tmp_1, tmp_2, tmp_3;
void init();
void initTmp(int face, int y_1, int x_1, int y_2, int x_2, int y_3, int x_3);
void turnCubeFace(int face, char dir);
void solve(char face, char dir);
void printUpSide();
int main() {
int T, n;
char face, dir, tmp;
scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%d%c", &n, &tmp);
init();
for (int j = 0; j < n; j++) {
scanf("%c%c%c", &face, &dir, &tmp);
solve(face, dir);
}
printUpSide();
}
return 0;
}
void init() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cube[U][i][j] = 'w';
cube[D][i][j] = 'y';
cube[F][i][j] = 'r';
cube[B][i][j] = 'o';
cube[L][i][j] = 'g';
cube[R][i][j] = 'b';
}
}
}
void initTmp(int face ,int y_1, int x_1, int y_2, int x_2, int y_3, int x_3) {
tmp_1 = cube[face][y_1][x_1];
tmp_2 = cube[face][y_2][x_2];
tmp_3 = cube[face][y_3][x_3];
}
void turnCubeFace(int face, char dir) {
char tmp1 = cube[face][0][0], tmp2 = cube[face][0][1];
if (dir == '-') {
cube[face][0][0] = cube[face][0][2];
cube[face][0][1] = cube[face][1][2];
cube[face][0][2] = cube[face][2][2];
cube[face][1][2] = cube[face][2][1];
cube[face][2][2] = cube[face][2][0];
cube[face][2][1] = cube[face][1][0];
cube[face][2][0] = tmp1;
cube[face][1][0] = tmp2;
}
else {
cube[face][0][0] = cube[face][2][0];
cube[face][0][1] = cube[face][1][0];
cube[face][2][0] = cube[face][2][2];
cube[face][1][0] = cube[face][2][1];
cube[face][2][2] = cube[face][0][2];
cube[face][2][1] = cube[face][1][2];
cube[face][0][2] = tmp1;
cube[face][1][2] = tmp2;
}
}
void solve(char face, char dir) {
int r_l;
switch (face) {
case 'U':
turnCubeFace(U, dir);
initTmp(B, 0, 2, 0, 1, 0, 0);
if (dir == '+') r_l = L;
else r_l = R;
cube[B][0][2] = cube[r_l][0][2];
cube[B][0][1] = cube[r_l][0][1];
cube[B][0][0] = cube[r_l][0][0];
cube[r_l][0][2] = cube[F][0][2];
cube[r_l][0][1] = cube[F][0][1];
cube[r_l][0][0] = cube[F][0][0];
if (r_l == L) r_l = R;
else r_l = L;
cube[F][0][2] = cube[r_l][0][2];
cube[F][0][1] = cube[r_l][0][1];
cube[F][0][0] = cube[r_l][0][0];
cube[r_l][0][2] = tmp_1;
cube[r_l][0][1] = tmp_2;
cube[r_l][0][0] = tmp_3;
break;
case 'D':
turnCubeFace(D, dir);
initTmp(B, 2, 2, 2, 1, 2, 0);
if (dir == '+') r_l = R;
else r_l = L;
cube[B][2][2] = cube[r_l][2][2];
cube[B][2][1] = cube[r_l][2][1];
cube[B][2][0] = cube[r_l][2][0];
cube[r_l][2][2] = cube[F][2][2];
cube[r_l][2][1] = cube[F][2][1];
cube[r_l][2][0] = cube[F][2][0];
if (r_l == L) r_l = R;
else r_l = L;
cube[F][2][2] = cube[r_l][2][2];
cube[F][2][1] = cube[r_l][2][1];
cube[F][2][0] = cube[r_l][2][0];
cube[r_l][2][2] = tmp_1;
cube[r_l][2][1] = tmp_2;
cube[r_l][2][0] = tmp_3;
break;
case 'F':
turnCubeFace(F, dir);
initTmp(U, 2, 0, 2, 1, 2, 2);
if (dir == '+') {
cube[U][2][0] = cube[L][2][2];
cube[U][2][1] = cube[L][1][2];
cube[U][2][2] = cube[L][0][2];
cube[L][2][2] = cube[D][2][0];
cube[L][1][2] = cube[D][2][1];
cube[L][0][2] = cube[D][2][2];
cube[D][2][0] = cube[R][0][0];
cube[D][2][1] = cube[R][1][0];
cube[D][2][2] = cube[R][2][0];
cube[R][0][0] = tmp_1;
cube[R][1][0] = tmp_2;
cube[R][2][0] = tmp_3;
}
else {
cube[U][2][0] = cube[R][0][0];
cube[U][2][1] = cube[R][1][0];
cube[U][2][2] = cube[R][2][0];
cube[R][0][0] = cube[D][2][0];
cube[R][1][0] = cube[D][2][1];
cube[R][2][0] = cube[D][2][2];
cube[D][2][0] = cube[L][2][2];
cube[D][2][1] = cube[L][1][2];
cube[D][2][2] = cube[L][0][2];
cube[L][2][2] = tmp_1;
cube[L][1][2] = tmp_2;
cube[L][0][2] = tmp_3;
}
break;
case 'B':
turnCubeFace(B, dir);
initTmp(U, 0, 0, 0, 1, 0, 2);
if (dir == '+') {
cube[U][0][0] = cube[R][0][2];
cube[U][0][1] = cube[R][1][2];
cube[U][0][2] = cube[R][2][2];
cube[R][0][2] = cube[D][0][0];
cube[R][1][2] = cube[D][0][1];
cube[R][2][2] = cube[D][0][2];
cube[D][0][0] = cube[L][2][0];
cube[D][0][1] = cube[L][1][0];
cube[D][0][2] = cube[L][0][0];
cube[L][2][0] = tmp_1;
cube[L][1][0] = tmp_2;
cube[L][0][0] = tmp_3;
}
else {
cube[U][0][0] = cube[L][2][0];
cube[U][0][1] = cube[L][1][0];
cube[U][0][2] = cube[L][0][0];
cube[L][2][0] = cube[D][0][0];
cube[L][1][0] = cube[D][0][1];
cube[L][0][0] = cube[D][0][2];
cube[D][0][0] = cube[R][0][2];
cube[D][0][1] = cube[R][1][2];
cube[D][0][2] = cube[R][2][2];
cube[R][0][2] = tmp_1;
cube[R][1][2] = tmp_2;
cube[R][2][2] = tmp_3;
}
break;
case 'L':
turnCubeFace(L, dir);
initTmp(U, 0, 0, 1, 0, 2, 0);
if (dir == '+') {
cube[U][0][0] = cube[B][2][2];
cube[U][1][0] = cube[B][1][2];
cube[U][2][0] = cube[B][0][2];
cube[B][2][2] = cube[D][2][2];
cube[B][1][2] = cube[D][1][2];
cube[B][0][2] = cube[D][0][2];
cube[D][2][2] = cube[F][0][0];
cube[D][1][2] = cube[F][1][0];
cube[D][0][2] = cube[F][2][0];
cube[F][0][0] = tmp_1;
cube[F][1][0] = tmp_2;
cube[F][2][0] = tmp_3;
}
else {
cube[U][0][0] = cube[F][0][0];
cube[U][1][0] = cube[F][1][0];
cube[U][2][0] = cube[F][2][0];
cube[F][0][0] = cube[D][2][2];
cube[F][1][0] = cube[D][1][2];
cube[F][2][0] = cube[D][0][2];
cube[D][2][2] = cube[B][2][2];
cube[D][1][2] = cube[B][1][2];
cube[D][0][2] = cube[B][0][2];
cube[B][2][2] = tmp_1;
cube[B][1][2] = tmp_2;
cube[B][0][2] = tmp_3;
}
break;
case 'R':
turnCubeFace(R, dir);
initTmp(U, 0, 2, 1, 2, 2, 2);
if (dir == '+') {
cube[U][0][2] = cube[F][0][2];
cube[U][1][2] = cube[F][1][2];
cube[U][2][2] = cube[F][2][2];
cube[F][0][2] = cube[D][2][0];
cube[F][1][2] = cube[D][1][0];
cube[F][2][2] = cube[D][0][0];
cube[D][2][0] = cube[B][2][0];
cube[D][1][0] = cube[B][1][0];
cube[D][0][0] = cube[B][0][0];
cube[B][2][0] = tmp_1;
cube[B][1][0] = tmp_2;
cube[B][0][0] = tmp_3;
}
else {
cube[U][0][2] = cube[B][2][0];
cube[U][1][2] = cube[B][1][0];
cube[U][2][2] = cube[B][0][0];
cube[B][2][0] = cube[D][2][0];
cube[B][1][0] = cube[D][1][0];
cube[B][0][0] = cube[D][0][0];
cube[D][2][0] = cube[F][0][2];
cube[D][1][0] = cube[F][1][2];
cube[D][0][0] = cube[F][2][2];
cube[F][0][2] = tmp_1;
cube[F][1][2] = tmp_2;
cube[F][2][2] = tmp_3;
}
break;
}
}
void printUpSide() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%c", cube[U][i][j]);
}
printf("\n");
}
}