본문 바로가기

BOJ/C++

[BOJ] 16939. 2X2X2 큐브

https://www.acmicpc.net/problem/16939

* 큐브를 회전할 때 같이 바뀌는 인덱스들을 rotateIdx[][] 에 저장해둔다. 

* 한 번만 회전하는 경우 나올 수 있는 경우의 수가 6개 이고 한 번 회전할 때 바뀌는 인덱스는 8개 이므로 

6*8 로 생성했다. 

*큐브의 현재 상태를 저장하는 것이 중요하다. 

* rotate()에는 큐브를 회전하고 check()를 통해 회전한 결과가 옳은지 확인한다. 

* deque를 사용해서 정방향으로 돌릴 때는 뒤에 값을 넣어주고, 역방향으로 돌릴 때는 앞에 값을 넣어준다. 

deque의 결과는 다시 큐에 넣고, check()에서 결과를 확인한다. 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <iostream>
#include <vector>
#include <cstring>
#include <deque>
using namespace std;
 
 
int cube[25];
int rotateIdx[6][8] = {{1, 3, 5, 7, 9, 11, 24, 22}, {2, 4, 6, 8, 10, 12, 23, 21}, {3, 4, 17, 19, 10, 9, 16, 14}, {1, 2, 18, 20, 12, 11, 15, 13}, {7, 8, 19, 20, 23, 24, 15, 16}, {5, 6, 17, 18, 21, 22, 13, 14}};
 
bool check()
{
    //각 면이
 
    for (int i = 1; i <= 24; i += 4)
    {
        for (int j = i; j < i + 4; j++)
        {
            if (cube[i] != cube[j])
                return false;
        }
    }
    return true;
}
void rotate()
{
    //첫번째 방법으로 돌려본다.
    //왼쪽/오른쪽을 돌릴 것인지 확인한다.
 
    deque<int> q;
    bool flag = false;
    int c_cube[25];
    memcpy(c_cube, cube, sizeof(cube));
 
    for (int i = 0; i < 6; i++)
    {
 
        int j = 0;
        for (; j < 8; j++)
        {
            q.push_back(rotateIdx[i][j]);
        }
 
        int cnt = 2;
        while (cnt--)
        {
            q.push_back(q.front());
            q.pop_front();
        }
 
        j = 0;
 
        while (!q.empty())
        {
            int idx = q.front();
            q.pop_front();
 
            cube[rotateIdx[i][j++]] = c_cube[idx];
        }
 
        if (check())
        {
            flag = true;
            cout << 1 << '\n';
            break;
        }
 
        memcpy(cube, c_cube, sizeof(cube));
 
        j = 0;
        for (; j < 8; j++)
        {
            q.push_back(rotateIdx[i][j]);
        }
 
        cnt = 2;
        while (cnt--)
        {
            q.push_front(q.back());
            q.pop_back();
        }
 
        j = 0;
 
        while (!q.empty())
        {
            int idx = q.front();
            q.pop_front();
 
            cube[rotateIdx[i][j++]] = c_cube[idx];
        }
 
        if (check())
        {
            flag = true;
            cout << 1 << '\n';
            break;
        }
 
        memcpy(cube, c_cube, sizeof(cube));
    }
 
    if (!flag)
        cout << 0 << '\n';
}
 
int main()
{
 
    ios_base::sync_with_stdio(0);
    cin.tie(0);
 
    //총 여섯가지의 방향 전환이 나온다.
    //모든 경우를 해 보고 가능하면 1, 아니면 0
 
    for (int i = 1; i <= 24; i++)
    {
        cin >> cube[i];
    }
 
    rotate();
    //전체 검사
 
    return 0;
}

'BOJ > C++' 카테고리의 다른 글

[BOJ] 9019. DSLR  (0) 2020.04.25
[BOJ] 17085. 십자가 2개 놓기  (0) 2020.04.20
[BOJ] 16932. 모양 만들기  (0) 2020.04.20
[BOJ] 17822. 원판 돌리기  (0) 2020.04.19
[BOJ] 16918. 봄버맨  (0) 2020.04.17