
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; //boj 2×2×2 큐브 https://www.acmicpc.net/problem/16939 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 |