ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 벡준 16939번 2x2x2 큐브
    PS 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;
    }

     

     

     

     

     

     

    '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
Designed by Tistory.