PS
벡준 16939번 2x2x2 큐브
남마허
2020. 3. 3. 14:31
https://www.acmicpc.net/problem/16939
16939번: 2×2×2 큐브
첫째 줄에 2×2×2 루빅스 큐브 각 면의 각 칸 색상이 주어진다. 색상은 1부터 6까지의 자연수로 나타내며, 각 자연수는 총 4번 등장한다. i번째 수가 의미하는 칸은 아래와 같다.
www.acmicpc.net
<접근방법>
시뮬레이션 문제입니다.
큐브를 한 번만 돌리면 되므로 12가지 경우의 수를 시뮬레이션 해야합니다.
마법같은 규칙을 발견할 수 없어서 하나하나 다 구현하였습니다.
<느낀 점>
상황 -> 동작 )
상황 -> 동작 )-----> 모듈(매개변수)
상황 -> 동작 )
<코드>
#include <iostream>
#include <algorithm>
using namespace std;
struct point {
int z, y, x;
};
int cube[6][2][2];
int tcube[6][2][2];
void print() {
for (int z = 0; z < 6; z++) {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
cout << tcube[z][i][j] << ' ';
}
}
puts("");
}
}
bool check() {
for (int z = 0; z < 6; z++) {
bool suc = true;
int c = tcube[z][0][0];
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
if (c != tcube[z][i][j]) {
return false;
}
}
}
}
cout << 1 << '\n';
exit(0);
}
void rotate_col(int a, int b, int c, int d, int floor) {
//floor == 0 -> 13, 14, 5, 6, 17, 18, 21 22
//floor == 1 -> 15, 16, 7, 8, 19, 20, 23, 24
int tnum[4] = { a, b, c, d };
int num[4] = { d, a, b, c };
for (int z = 0; z < 4; z++) {
for (int i = 0; i < 2; i++) {
tcube[tnum[z]][floor][i] = cube[num[z]][floor][i];
}
}
}
void rotate_row(int a, int b, int c, int d, int floor) {
//floor == 0 -> 1, 3, 5, 7, 9, 11
//floor == 1 -> 2, 4, 6, 8, 10, 12
int tnum[4] = { a, b, c, d };
int num[4] = { d, a, b, c };
for (int z = 0; z < 4; z++) {
for (int i = 0; i < 2; i++) {
tcube[tnum[z]][i][floor] = cube[num[z]][i][floor];
}
}
}
void rotate_square1(int dir) {
int t[8] = { cube[0][0][0], cube[0][0][1], cube[4][0][1],
cube[4][1][1], cube[2][1][0], cube[2][1][1],
cube[3][0][0], cube[3][1][0] };
point p1[8] = { {0, 0, 0}, {0, 0, 1}, {4, 0, 1}, {4, 1, 1},
{2, 1, 0}, {2, 1, 1}, {3, 0, 0}, {3, 1, 0} };
if (dir == 1) {
reverse(p1, p1 + 8);
}
int d = 0;
for (int i = 0; i < 8; i++) {
int tz = p1[i].z, ty = p1[i].y, tx = p1[i].x;
int d = (i + 2) % 8;
int z = p1[d].z, y = p1[d].y, x = p1[d].x;
tcube[tz][ty][tx] = cube[z][y][x];
}
}
void rotate_square2(int dir) {
point p2[8] = { {0, 1, 0}, {0, 1, 1}, {4, 0, 0}, {4, 1, 0},
{2, 0, 0}, {2, 0, 1}, {3, 0, 1}, {3, 1, 1} };
if (dir == 1) {
reverse(p2, p2 + 8);
}
int d = 0;
for (int i = 0; i < 8; i++) {
int tz = p2[i].z, ty = p2[i].y, tx = p2[i].x;
int d = (i + 2) % 8;
int z = p2[d].z, y = p2[d].y, x = p2[d].x;
tcube[tz][ty][tx] = cube[z][y][x];
}
}
void init() {
for (int z = 0; z < 6; z++) {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
tcube[z][i][j] = cube[z][i][j];
}
}
}
}
void simul() {
init();
rotate_col(3, 1, 4, 5, 0);
check();
init();
rotate_col(3, 1, 4, 5, 1);
check();
init();
rotate_col(5, 4, 1, 3, 0);
check();
init();
rotate_col(5, 4, 1, 3, 1);
check();
init();
rotate_square1(1);
check();
init();
rotate_square1(0);
check();
init();
rotate_square2(0);
check();
init();
rotate_square2(1);
check();
init();
for (int i = 0; i < 2; i++) {
cube[5][i][0] = tcube[5][i][1];
cube[5][i][1] = tcube[5][i][0];
}
rotate_row(0, 1, 2, 5, 0);
check();
init();
rotate_row(0, 1, 2, 5, 1);
check();
init();
rotate_row(5, 2, 1, 0, 0);
check();
init();
rotate_row(5, 2, 1, 0, 1);
check();
cout << 0 << '\n';
}
int main() {
for (int z = 0; z < 6; z++) {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
cin >> cube[z][i][j];
}
}
}
simul();
return 0;
}
반응형