https://www.acmicpc.net/problem/16939
시키는 대로 구현하면 되는 문제입니다.
총 6개의 축으로 돌릴 수 있고 각 축마다 시계/반시계 방향으로 돌릴 수 있습니다. 2x2x2 큐브인데다가 딱 한 번 돌렸을 때 가능한지 묻는 문제이기 때문에 돌려질 때의 옆면은 신경쓰지 않아도 됩니다.
어떤 면들이 축인지를 입력받아 회전시켜주는 함수 rotate를 만들었고 반시계로 돌린다는 건 시계 방향으로 세 번 돌려준다는 뜻이기 때문에 각 축에 대해 네 번씩 돌려주며 중간중간 큐브가 맞춰줬는지 확인해줬습니다.
이것보단 깨끗하게 짤 수 있을 거 같은데... 머리보다 몸이 고생하는 게 좋았기 때문에 그냥 짰습니다.
큐빙과의 난이도 차이는 크게 모르겠어요. 비슷하게 귀찮은 문제인거 같습니다.
아래는 코드입니다.
#include <bits/stdc++.h>
#define FastIO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
#define ends ' '
using namespace std;
int T, n, cube[25];
int checkcheck(int a, int b, int c, int d) {
if (a == b && b == c && c == d) return 1;
return 0;
}
int check() {
for (int i = 1; i < 24; i += 4) {
if (!checkcheck(cube[i], cube[i + 1], cube[i + 2], cube[i + 3])) {
return 0;
}
}
return 1;
}
void rotate(int c1, int c2, int c3, int c4, int c5, int c6, int c7, int c8) {
int tmp1 = cube[c1];
int tmp2 = cube[c2];
cube[c1] = cube[c3];
cube[c2] = cube[c4];
cube[c3] = cube[c5];
cube[c4] = cube[c6];
cube[c5] = cube[c7];
cube[c6] = cube[c8];
cube[c7] = tmp1;
cube[c8] = tmp2;
}
int32_t main(void) {
FastIO;
T = 1;
//cin >> T;
while (T--) {
for (int i = 1; i <= 24; i++) cin >> cube[i];
int flag = 0;
rotate(1, 3, 5, 7, 9, 11, 24, 22);
if (check()) flag = 1;
rotate(1, 3, 5, 7, 9, 11, 24, 22);
rotate(1, 3, 5, 7, 9, 11, 24, 22);
if (check()) flag = 1;
rotate(1, 3, 5, 7, 9, 11, 24, 22);
rotate(2, 4, 6, 8, 10, 12, 23, 21);
if (check()) flag = 1;
rotate(2, 4, 6, 8, 10, 12, 23, 21);
rotate(2, 4, 6, 8, 10, 12, 23, 21);
if (check()) flag = 1;
rotate(2, 4, 6, 8, 10, 12, 23, 21);
rotate(13, 14, 5, 6, 17, 18, 21, 22);
if (check()) flag = 1;
rotate(13, 14, 5, 6, 17, 18, 21, 22);
rotate(13, 14, 5, 6, 17, 18, 21, 22);
if (check()) flag = 1;
rotate(13, 14, 5, 6, 17, 18, 21, 22);
rotate(15, 16, 7, 8, 19, 20, 23, 24);
if (check()) flag = 1;
rotate(15, 16, 7, 8, 19, 20, 23, 24);
rotate(15, 16, 7, 8, 19, 20, 23, 24);
if (check()) flag = 1;
rotate(15, 16, 7, 8, 19, 20, 23, 24);
rotate(3, 4, 17, 19, 10, 9, 16, 14);
if (check()) flag = 1;
rotate(3, 4, 17, 19, 10, 9, 16, 14);
rotate(3, 4, 17, 19, 10, 9, 16, 14);
if (check()) flag = 1;
rotate(3, 4, 17, 19, 10, 9, 16, 14);
rotate(1, 2, 18, 20, 12, 11, 15, 13);
if (check()) flag = 1;
rotate(1, 2, 18, 20, 12, 11, 15, 13);
rotate(1, 2, 18, 20, 12, 11, 15, 13);
if (check()) flag = 1; rotate(1, 2, 18, 20, 12, 11, 15, 13);
if (flag) cout << 1 << endl;
else cout << 0 << endl;
}
return 0;
}
'알고리즘 문제해결 > BOJ' 카테고리의 다른 글
BOJ 5502 팰린드롬 (0) | 2022.08.04 |
---|---|
BOJ 8872 빌라봉 (0) | 2022.08.03 |
BOJ 5859 Liars and Truth Tellers (0) | 2022.08.02 |
BOJ 1635 1 또는 -1 (0) | 2022.08.01 |
BOJ 3056 007 (0) | 2022.07.29 |