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;
}

 

 

 

 

 

 

반응형