[백준/BOJ] 백준 5373번 : 큐빙
2020. 12. 28. 20:58ㆍ알고리즘 문제풀이
큐브의 면을 돌렸을 때 어떻게 변하는지를 설정해 놓는다. 해당 면을 돌릴 때 어떻게 변하는지 설정하기 위해 해당 면에 접해있는 4개의 줄들이 변하는 것과, 해당 면이 회전하는 것을 고려한다.
코드
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int tc;
int n;
char cube[6][3][3];
//큐브 초기화
void Pre()
{
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 3; j++)
{
for (int k = 0; k < 3; k++)
{
if (i == 0)
cube[i][j][k] = 'w';
else if (i == 1)
cube[i][j][k] = 'y';
else if (i == 2)
cube[i][j][k] = 'r';
else if (i == 3)
cube[i][j][k] = 'o';
else if (i == 4)
cube[i][j][k] = 'g';
else if (i == 5)
cube[i][j][k] = 'b';
}
}
}
}
//해당 면 회전
void TurnThisDir(int dir, char clock)
{
char temp1 = cube[dir][0][0];
char temp2 = cube[dir][1][0];
char temp3 = cube[dir][2][0];
char temp4 = cube[dir][2][1];
char temp5 = cube[dir][2][2];
char temp6 = cube[dir][1][2];
char temp7 = cube[dir][0][2];
char temp8 = cube[dir][0][1];
if (clock == '+')
{
cube[dir][0][0] = temp3;
cube[dir][0][1] = temp2;
cube[dir][0][2] = temp1;
cube[dir][1][0] = temp4;
cube[dir][1][2] = temp8;
cube[dir][2][0] = temp5;
cube[dir][2][1] = temp6;
cube[dir][2][2] = temp7;
}
else
{
cube[dir][0][0] = temp7;
cube[dir][0][1] = temp6;
cube[dir][0][2] = temp5;
cube[dir][1][0] = temp8;
cube[dir][1][2] = temp4;
cube[dir][2][0] = temp1;
cube[dir][2][1] = temp2;
cube[dir][2][2] = temp3;
}
}
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> tc;
for (int t = 0; t < tc; t++)
{
Pre();
cin >> n;
for (int i = 0; i < n; i++)
{
string turn;
char temp[3];
cin >> turn;
//윗면일때
if (turn[0] == 'U')
{
temp[0] = cube[2][0][0];
temp[1] = cube[2][0][1];
temp[2] = cube[2][0][2];
//해당면 옆에 4줄 회전(시계 방향)
if (turn[1] == '+')
{
cube[2][0][0] = cube[5][0][0];
cube[2][0][1] = cube[5][0][1];
cube[2][0][2] = cube[5][0][2];
cube[5][0][0] = cube[3][0][0];
cube[5][0][1] = cube[3][0][1];
cube[5][0][2] = cube[3][0][2];
cube[3][0][0] = cube[4][0][0];
cube[3][0][1] = cube[4][0][1];
cube[3][0][2] = cube[4][0][2];
cube[4][0][0] = temp[0];
cube[4][0][1] = temp[1];
cube[4][0][2] = temp[2];
}
//해당면 옆에 4줄 회전(반시계 방향)
else if (turn[1] == '-')
{
cube[2][0][0] = cube[4][0][0];
cube[2][0][1] = cube[4][0][1];
cube[2][0][2] = cube[4][0][2];
cube[4][0][0] = cube[3][0][0];
cube[4][0][1] = cube[3][0][1];
cube[4][0][2] = cube[3][0][2];
cube[3][0][0] = cube[5][0][0];
cube[3][0][1] = cube[5][0][1];
cube[3][0][2] = cube[5][0][2];
cube[5][0][0] = temp[0];
cube[5][0][1] = temp[1];
cube[5][0][2] = temp[2];
}
//해당 면 회전
TurnThisDir(0, turn[1]);
}
if (turn[0] == 'D')
{
temp[0] = cube[2][2][0];
temp[1] = cube[2][2][1];
temp[2] = cube[2][2][2];
if (turn[1] == '+')
{
cube[2][2][0] = cube[4][2][0];
cube[2][2][1] = cube[4][2][1];
cube[2][2][2] = cube[4][2][2];
cube[4][2][0] = cube[3][2][0];
cube[4][2][1] = cube[3][2][1];
cube[4][2][2] = cube[3][2][2];
cube[3][2][0] = cube[5][2][0];
cube[3][2][1] = cube[5][2][1];
cube[3][2][2] = cube[5][2][2];
cube[5][2][0] = temp[0];
cube[5][2][1] = temp[1];
cube[5][2][2] = temp[2];
}
else if (turn[1] == '-')
{
cube[2][2][0] = cube[5][2][0];
cube[2][2][1] = cube[5][2][1];
cube[2][2][2] = cube[5][2][2];
cube[5][2][0] = cube[3][2][0];
cube[5][2][1] = cube[3][2][1];
cube[5][2][2] = cube[3][2][2];
cube[3][2][0] = cube[4][2][0];
cube[3][2][1] = cube[4][2][1];
cube[3][2][2] = cube[4][2][2];
cube[4][2][0] = temp[0];
cube[4][2][1] = temp[1];
cube[4][2][2] = temp[2];
}
TurnThisDir(1, turn[1]);
}
if (turn[0] == 'F')
{
temp[0] = cube[0][2][0];
temp[1] = cube[0][2][1];
temp[2] = cube[0][2][2];
if (turn[1] == '+')
{
cube[0][2][0] = cube[4][2][2];
cube[0][2][1] = cube[4][1][2];
cube[0][2][2] = cube[4][0][2];
cube[4][0][2] = cube[1][0][0];
cube[4][1][2] = cube[1][0][1];
cube[4][2][2] = cube[1][0][2];
cube[1][0][0] = cube[5][2][0];
cube[1][0][1] = cube[5][1][0];
cube[1][0][2] = cube[5][0][0];
cube[5][2][0] = temp[2];
cube[5][1][0] = temp[1];
cube[5][0][0] = temp[0];
}
else if (turn[1] == '-')
{
cube[0][2][0] = cube[5][0][0];
cube[0][2][1] = cube[5][1][0];
cube[0][2][2] = cube[5][2][0];
cube[5][0][0] = cube[1][0][2];
cube[5][1][0] = cube[1][0][1];
cube[5][2][0] = cube[1][0][0];
cube[1][0][0] = cube[4][0][2];
cube[1][0][1] = cube[4][1][2];
cube[1][0][2] = cube[4][2][2];
cube[4][0][2] = temp[2];
cube[4][1][2] = temp[1];
cube[4][2][2] = temp[0];
}
TurnThisDir(2, turn[1]);
}
if (turn[0] == 'B')
{
temp[0] = cube[0][0][0];
temp[1] = cube[0][0][1];
temp[2] = cube[0][0][2];
if (turn[1] == '+')
{
cube[0][0][0] = cube[5][0][2];
cube[0][0][1] = cube[5][1][2];
cube[0][0][2] = cube[5][2][2];
cube[5][0][2] = cube[1][2][2];
cube[5][1][2] = cube[1][2][1];
cube[5][2][2] = cube[1][2][0];
cube[1][2][0] = cube[4][0][0];
cube[1][2][1] = cube[4][1][0];
cube[1][2][2] = cube[4][2][0];
cube[4][0][0] = temp[2];
cube[4][1][0] = temp[1];
cube[4][2][0] = temp[0];
}
else if (turn[1] == '-')
{
cube[0][0][0] = cube[4][2][0];
cube[0][0][1] = cube[4][1][0];
cube[0][0][2] = cube[4][0][0];
cube[4][0][0] = cube[1][2][0];
cube[4][1][0] = cube[1][2][1];
cube[4][2][0] = cube[1][2][2];
cube[1][2][0] = cube[5][2][2];
cube[1][2][1] = cube[5][1][2];
cube[1][2][2] = cube[5][0][2];
cube[5][2][2] = temp[2];
cube[5][1][2] = temp[1];
cube[5][0][2] = temp[0];
}
TurnThisDir(3, turn[1]);
}
if (turn[0] == 'L')
{
temp[0] = cube[0][0][0];
temp[1] = cube[0][1][0];
temp[2] = cube[0][2][0];
if (turn[1] == '+')
{
cube[0][0][0] = cube[3][2][2];
cube[0][1][0] = cube[3][1][2];
cube[0][2][0] = cube[3][0][2];
cube[3][0][2] = cube[1][2][0];
cube[3][1][2] = cube[1][1][0];
cube[3][2][2] = cube[1][0][0];
cube[1][0][0] = cube[2][0][0];
cube[1][1][0] = cube[2][1][0];
cube[1][2][0] = cube[2][2][0];
cube[2][0][0] = temp[0];
cube[2][1][0] = temp[1];
cube[2][2][0] = temp[2];
}
else if (turn[1] == '-')
{
cube[0][0][0] = cube[2][0][0];
cube[0][1][0] = cube[2][1][0];
cube[0][2][0] = cube[2][2][0];
cube[2][0][0] = cube[1][0][0];
cube[2][1][0] = cube[1][1][0];
cube[2][2][0] = cube[1][2][0];
cube[1][0][0] = cube[3][2][2];
cube[1][1][0] = cube[3][1][2];
cube[1][2][0] = cube[3][0][2];
cube[3][2][2] = temp[0];
cube[3][1][2] = temp[1];
cube[3][0][2] = temp[2];
}
TurnThisDir(4, turn[1]);
}
if (turn[0] == 'R')
{
temp[0] = cube[0][0][2];
temp[1] = cube[0][1][2];
temp[2] = cube[0][2][2];
if (turn[1] == '+')
{
cube[0][0][2] = cube[2][0][2];
cube[0][1][2] = cube[2][1][2];
cube[0][2][2] = cube[2][2][2];
cube[2][0][2] = cube[1][0][2];
cube[2][1][2] = cube[1][1][2];
cube[2][2][2] = cube[1][2][2];
cube[1][0][2] = cube[3][2][0];
cube[1][1][2] = cube[3][1][0];
cube[1][2][2] = cube[3][0][0];
cube[3][2][0] = temp[0];
cube[3][1][0] = temp[1];
cube[3][0][0] = temp[2];
}
else if (turn[1] == '-')
{
cube[0][0][2] = cube[3][2][0];
cube[0][1][2] = cube[3][1][0];
cube[0][2][2] = cube[3][0][0];
cube[3][2][0] = cube[1][0][2];
cube[3][1][0] = cube[1][1][2];
cube[3][0][0] = cube[1][2][2];
cube[1][0][2] = cube[2][0][2];
cube[1][1][2] = cube[2][1][2];
cube[1][2][2] = cube[2][2][2];
cube[2][0][2] = temp[0];
cube[2][1][2] = temp[1];
cube[2][2][2] = temp[2];
}
TurnThisDir(5, turn[1]);
}
}
//윗면출력
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
cout << cube[0][i][j];
cout << "\n";
}
}
return 0;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 16235번 : 나무 재테크 (0) | 2020.12.29 |
---|---|
[백준/BOJ] 백준 16234번 : 인구 이동 (0) | 2020.12.28 |
[백준/BOJ] 백준 15685번 : 드래곤 커브 (0) | 2020.12.28 |
[백준/BOJ] 백준 15684번 : 사다리 조작 (0) | 2020.12.26 |
[백준/BOJ] 백준 2225번 : 합분해 (0) | 2020.12.26 |