Problem Solving/BOJ
[BOJ] #14499 _ 주사위 굴리기
Grini
2019. 8. 28. 21:19
[주사위 굴리기] https://www.acmicpc.net/problem/14499
14499번: 주사위 굴리기
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마
www.acmicpc.net
주어진 주사위 도면도의 숫자가 동쪽, 서쪽, 북쪽, 남쪽으로 이동할 때 동일한 규칙으로 변경된다.
주사위의 방향에 따른 변경되는 규칙을 파악하면 된다.
[ 주사위 이동 규칙 ]
알아낸 규칙을 이용하여 하드코딩 하였다.
[ 소스 코드 ]
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dx[5] = { 0, 1, -1, 0, 0 }, dy[5] = { 0, 0, 0, -1, 1 };
int N, M, map[21][21];
int K, dir[1001], dice[7];
pair<int, int> dice_init;
void solve();
int main() {
scanf("%d %d %d %d %d", &N, &M, &dice_init.first, &dice_init.second, &K);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) scanf("%d", &map[i][j]);
}
for (int i = 0; i < K; i++) scanf("%d", &dir[i]);
solve();
return 0;
}
void solve() {
int tmp_dice[7] = { 0, };
dice[1] = map[dice_init.first][dice_init.second];
for (int i = 0; i < K; i++) {
dice_init.first += dy[dir[i]];
dice_init.second += dx[dir[i]];
if (dice_init.first < 0 || dice_init.second < 0 || dice_init.first >= N || dice_init.second >= M) {
dice_init.first -= dy[dir[i]];
dice_init.second -= dx[dir[i]];
continue;
}
switch (dir[i]) {
case 1:
tmp_dice[4] = dice[1];
tmp_dice[1] = dice[3];
tmp_dice[6] = dice[4];
tmp_dice[3] = dice[6];
tmp_dice[2] = dice[2];
tmp_dice[5] = dice[5];
break;
case 2:
tmp_dice[3] = dice[1];
tmp_dice[6] = dice[3];
tmp_dice[1] = dice[4];
tmp_dice[4] = dice[6];
tmp_dice[2] = dice[2];
tmp_dice[5] = dice[5];
break;
case 3:
tmp_dice[5] = dice[1];
tmp_dice[1] = dice[2];
tmp_dice[6] = dice[5];
tmp_dice[2] = dice[6];
tmp_dice[3] = dice[3];
tmp_dice[4] = dice[4];
break;
case 4:
tmp_dice[2] = dice[1];
tmp_dice[6] = dice[2];
tmp_dice[1] = dice[5];
tmp_dice[5] = dice[6];
tmp_dice[3] = dice[3];
tmp_dice[4] = dice[4];
break;
}
memcpy(dice, tmp_dice, sizeof(int) * 7);
memset(tmp_dice, 0, sizeof(int) * 7);
if (map[dice_init.first][dice_init.second] == 0) map[dice_init.first][dice_init.second] = dice[1];
else {
dice[1] = map[dice_init.first][dice_init.second];
map[dice_init.first][dice_init.second] = 0;
}
printf("%d\n", dice[6]);
}
}