Link https://www.acmicpc.net/problem/14499
소스결과 1988 KB / 0 ms
출처 Baekjoon
언어 C++ 17
분류 시뮬레이션
설명
모든 면에 0이 적혀있고, 지도 위를 움직이면서 값이 복사되고 지도의 값이 바뀌는 특별한 주사위 게임이 있다.
명령이 주어졌을 때 위를 향하고 있는 주사위의 눈의 값을 출력해주자.
문제 내용은 아주 간단하다. 다만 구현에 있어서 가장 난해한 부분은 주사위를 어떤 방식으로 구현 하는가가 가장 어렵다.
처음에는 4 x 3 배열로 구현해 규칙을 지정하려 했으나. 생각대로 안되고 너무 어려웠다.
질문 게시판을 보고 힌트를 얻어 주사위를 6칸의 1차원 배열로 지정해 자신만의 규칙을 부여한 형태로 구현했다.
결론은 4가지 방향에 대해 각각의 다른 결과로 코딩을 해주어야 한다. 규칙이 없다.
보드의 값이 주사위로 옮겨지는 경우 보드의 값은 0으로 초기화 되지만. 주사위의 값이 보드로 옮겨지는 경우 주사위의 눈은 초기화 되지 않는다.
방향은 동 서 남 북 이 아닌 동 서 북 남 순서로 값이 지정됬다.
이 점을 유의해 문제를 해결했다.
알고리즘
1. 지도의 크기, 위치, 명령의 수를 받는다.
2. 지도를 초기화 하고 지정된 위치에서 주사위 굴리기를 시작한다.
3. 주사위를 굴리는 명령을 받고 해당 위치로 주사위를 굴린다.
4. 주사위가 굴려진 후 지도의 값에 따른 명령을 실행한다.
5. 각 시도마다 맨 위의 눈을 출력한다.
소스코드
#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;
}
'Algorithm > Simulation' 카테고리의 다른 글
Baekjoon 14890 경사로 (0) | 2019.04.01 |
---|---|
Baekjoon 3190 뱀 (0) | 2019.03.09 |
Baekjoon 14891 톱니바퀴 (0) | 2019.03.08 |
BaekJoon 1966 프린터큐 (0) | 2019.01.10 |
BaekJoon 2455 지능형 기차 (0) | 2019.01.10 |