-
벡준 16939번 2x2x2 큐브PS 2020. 3. 3. 14:31
https://www.acmicpc.net/problem/16939
<접근방법>
시뮬레이션 문제입니다.
큐브를 한 번만 돌리면 되므로 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; }
'PS' 카테고리의 다른 글
백준 17471번 게리맨더링 (0) 2020.03.05 백준 1022번 소용돌이 예쁘게 출력하기 (0) 2020.03.03 백준 16637번 괄호 추가하기 (0) 2020.02.27 백준 16922번 로마 숫자 만들기 (0) 2020.02.27 백준 9376번 탈옥 (0) 2020.02.27