모든 면에 0이 적혀있고, 지도 위를 움직이면서 값이 복사되고 지도의 값이 바뀌는 특별한 주사위 게임이 있다.
명령이 주어졌을 때 위를 향하고 있는 주사위의 눈의 값을 출력해주자.
문제 내용은 아주 간단하다. 다만 구현에 있어서 가장 난해한 부분은 주사위를 어떤 방식으로 구현 하는가가 가장 어렵다.
처음에는 4 x 3 배열로 구현해 규칙을 지정하려 했으나. 생각대로 안되고 너무 어려웠다.
질문 게시판을 보고 힌트를 얻어 주사위를 6칸의 1차원 배열로 지정해 자신만의 규칙을 부여한 형태로 구현했다.
결론은 4가지 방향에 대해 각각의 다른 결과로 코딩을 해주어야 한다. 규칙이 없다.
보드의 값이 주사위로 옮겨지는 경우 보드의 값은 0으로 초기화 되지만. 주사위의 값이 보드로 옮겨지는 경우 주사위의 눈은 초기화 되지 않는다.
방향은 동 서 남 북 이 아닌 동 서 북 남 순서로 값이 지정됬다.
이 점을 유의해 문제를 해결했다.
#include <iostream>
using namespace std;
const short BOARD_MAX = 20;
const short ORDER_MAX = 1000;
short board[BOARD_MAX][BOARD_MAX];
const short posX[5] = { 0, 0, 0, -1, 1 }; // 동 서 북 남
const short posY[5] = { 0, 1, -1, 0, 0 };
short dice[6];
void rollDice(int cmd)
{
short temp[6];
for (int i = 0; i < 6; i++)
temp[i] = dice[i];
if (cmd == 1)
{
dice[0] = temp[2];
dice[2] = temp[5];
dice[4] = temp[0];
dice[5] = temp[4];
}
else if (cmd == 2)
{
dice[0] = temp[4];
dice[2] = temp[0];
dice[4] = temp[5];
dice[5] = temp[2];
}
else if (cmd == 3)
{
dice[0] = temp[1];
dice[1] = temp[5];
dice[3] = temp[0];
dice[5] = temp[3];
}
else if (cmd == 4)
{
dice[0] = temp[3];
dice[1] = temp[0];
dice[3] = temp[5];
dice[5] = temp[1];
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int row, col, d_x, d_y, order;
cin >> row >> col >> d_x >> d_y >> order;
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
cin >> board[i][j];
for (int i = 0; i < order; i++)
{
int cmd;
cin >> cmd;
int nextX = d_x + posX[cmd];
int nextY = d_y + posY[cmd];
if (0 <= nextX && nextX < row && 0 <= nextY && nextY < col)
{
rollDice(cmd);
d_x = nextX;
d_y = nextY;
if (board[d_x][d_y])
{
dice[0] = board[d_x][d_y];
board[d_x][d_y] = 0;
}
else
board[d_x][d_y] = dice[0];
cout << dice[5] << '\n';
}
}
return 0;
}
2019-03-09 02:18:43에 Tistory에서 작성되었습니다.