백준[14499] - 주사위 굴리기

문제

백준 14499 문제 보기

접근 방법

문제가 처음에는 이해가 되지않아 문제를 이해하는데 시간을 좀 들였다. 이 문제는 동, 서, 남, 북으로 움직일때 전개도의 변화를 확인하면 문제를 풀수 있다. 바닥과 맞닿는 부분을 0, 하늘을 보고 있는 부분은 2, 이런 식으로 임의로 인덱스 부여하고 변화에 따른 전개도를 배열로 표현하면 문제를 풀수있다.

코드

#include <iostream>

using namespace std;

int N, M, x, y, K;
int map[21][21];
int order[1001];
int dice[6];

void right() {
    int temp[6];
    for(int i = 0; i < 6; i ++){
        temp[i] = dice[i];
    }

    dice[0] = temp[5];
    dice[1] = temp[1];
    dice[2] = temp[4];
    dice[3] = temp[3];
    dice[4] = temp[0];
    dice[5] = temp[2];
}

void left() {
    int temp[6];
    for(int i = 0; i < 6; i ++){
        temp[i] = dice[i];
    }

    dice[0] = temp[4];
    dice[1] = temp[1];
    dice[2] = temp[5];
    dice[3] = temp[3];
    dice[4] = temp[2];
    dice[5] = temp[0];
}

void up() {
    int temp[6];
    for(int i = 0; i < 6; i ++){
        temp[i] = dice[i];
    }

    dice[0] = temp[1];
    dice[1] = temp[2];
    dice[2] = temp[3];
    dice[3] = temp[0];
    dice[4] = temp[4];
    dice[5] = temp[5];
}

void down() {
    int temp[6];
    for(int i = 0; i < 6; i ++){
        temp[i] = dice[i];
    }

    dice[0] = temp[3];
    dice[1] = temp[0];
    dice[2] = temp[1];
    dice[3] = temp[2];
    dice[4] = temp[4];
    dice[5] = temp[5];
}

int main() {
    cin >> N >> M >> x >> y >> K;
    for(int i = 0; i < N; i ++) {
        for(int j = 0; j < M; j ++) {
            cin >> map[i][j];
        }
    }
    for(int i = 0; i < K; i ++) {
        cin >> order[i];
    }
    for(int i = 0; i < K; i ++) {
        int dir = order[i];

        if(dir == 1) {
            if(y+1 == M) {
                continue;
            }
            y ++;
            right();
            cout << dice[2] << "\n";
            if(map[x][y] == 0) {
                map[x][y] = dice[0];
            } else {
                dice[0] = map[x][y];
                map[x][y] = 0;
            }
        }else if(dir == 2) {
            if(y-1 < 0) {
                continue;
            }
            y --;
            left();
            cout << dice[2] << "\n";
            if(map[x][y] == 0) {
                map[x][y] = dice[0];
            } else {
                dice[0] = map[x][y];
                map[x][y] = 0;
            }
        }else if(dir == 3) {
            if(x-1 < 0) {
                continue;
            }
            x --;
            up();

            cout << dice[2] << "\n";
            if(map[x][y] == 0) {
                map[x][y] = dice[0];
            } else {
                dice[0] = map[x][y];
                map[x][y] = 0;
            }
        } else {
            if(x+1 == N) {
                continue;
            }
            x ++;
            down();

            cout << dice[2] << "\n";

            if(map[x][y] == 0) {
                map[x][y] = dice[0];
            } else {
                dice[0] = map[x][y];
                map[x][y] = 0;
            }
        }

    }
    return 0;
}
Share