문제 링크

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";
        }
    }
}

댓글남기기