본문 바로가기

code/BOJ

큐빙

/* 1 */
#include <iostream>
#include <string.h>
#include <string>
#define f(i, n) for(int i = 0; i < (n); ++i)
using namespace std;
// original
char cb[2][6][3][3]; bool sd;	// 초기화 완료
char clr[6] = { 'w', 'y', 'r', 'o', 'g', 'b' };
int dir['Z' + 1];
// turn
int src[6][2][4] = {	// 기준 p(rotax), 회전방향 +-(rotdr), src p
{ { 5, 2, 4, 3 },{ 4, 3, 5, 2 } },
{ { 4, 3, 5, 2 },{ 5, 2, 4, 3 } },
{ { 4, 0, 5, 1 },{ 5, 1, 4, 0 } },
{ { 5, 1, 4, 0 },{ 4, 0, 5, 1 } },
{ { 3, 0, 2, 1 },{ 2, 1, 3, 0 } },
{ { 2, 1, 3, 0 },{ 3, 0, 2, 1 } },
};
int dst[6][2][4] = {	// 기준 p(rotax), 회전방향 +-(rotdr), dst p
{ { 2, 4, 3, 5 },{ 2, 4, 3, 5 } },
{ { 2, 4, 3, 5 },{ 2, 4, 3, 5 } },
{ { 0, 5, 1, 4 },{ 0, 5, 1, 4 } },
{ { 0, 5, 1, 4 },{ 0, 5, 1, 4 } },
{ { 0, 2, 1, 3 },{ 0, 2, 1, 3 } },
{ { 0, 2, 1, 3 },{ 0, 2, 1, 3 } },
};
struct info {
	bool b;
	int i;
};
enum { R, C };
info cell[6][4] = {	// 기준 p(rotax), r/c, 그 좌표값
{ { R, 0 },{ R, 0 },{ R, 0 },{ R, 0 } },
{ { R, 2 },{ R, 2 },{ R, 2 },{ R, 2 } },
{ { C, 2 },{ C, 2 },{ C, 2 },{ C, 2 } },
{ { C, 0 },{ C, 0 },{ C, 0 },{ C, 0 } },
{ { R, 0 },{ C, 0 },{ R, 0 },{ C, 0 } },
{ { R, 2 },{ C, 2 },{ R, 2 },{ C, 2 } }
};
int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int d = 0;
	for (char ch : {'U', 'D', 'F', 'B', 'L', 'R'})
		dir[ch] = d++;

	int T; cin >> T;
	for (int tc = 1; tc <= T; ++tc) {
		sd = 0;
		f(p, 6) f(r, 3) f(c, 3) cb[sd][p][r][c] = clr[p];
		int N; cin >> N;
		while (N--) {
			memcpy(cb[!sd], cb[sd], sizeof(char) * 6 * 3 * 3);
			string in; cin >> in;
			int rotax = dir[in[0]], rotdr = (in[1] == '-');	/* 1 */
			f(p, 4) {
				f(i, 3) {
					if (cell[rotax][p].b == R)	cb[!sd][dst[rotax][rotdr][p]][cell[rotax][p].i][i] = cb[sd][src[rotax][rotdr][p]][cell[rotax][p].i][i];
					else						cb[!sd][dst[rotax][rotdr][p]][i][cell[rotax][p].i] = cb[sd][src[rotax][rotdr][p]][i][cell[rotax][p].i];
				}
			}
			sd = !sd;
		}
		f(r, 3) {
			f(c, 3) cout << cb[sd][0][c][r];
			cout << '\n';
		}
	}
	return 0;
}