귀염둥이의 메모

[백준] 14499번: 주사위 굴리기 (C++) 본문

CS/백준

[백준] 14499번: 주사위 굴리기 (C++)

겸둥이xz 2021. 4. 2. 18:04
반응형

 

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개의 줄에 지도

www.acmicpc.net

주사위를 배열 vh를 통해서 표현했다.

 

명령에 따라서 vh를 규칙에 맞게 적절히 업데이트하며 조건에 맞게 코드를 작성했다.

 

 

소스코드

#include <bits/stdc++.h>
using namespace std;

int n, m, x, y, k;
int g[20][20];
int d[5][2] = {{0, 0}, {0, 1}, {0, -1}, {-1, 0}, {1, 0}};
int v[4];
int h[3];
queue<int> cmd;

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m >> x >> y >> k;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> g[i][j];
    for (int i  = 0; i < k; i++) {
        int c; cin >> c;
        cmd.push(c);
    }

    while(!cmd.empty()) {
        int c = cmd.front(); cmd.pop();
        int nx = x + d[c][0];
        int ny = y + d[c][1];

        if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;

        int tmp = v[3]; // v[3]은 주사위 밑바닥, v[1]과 h[1]은 주사위 윗면
        switch (c) {
            case 1:
                v[3] = h[2];
                h[2] = h[1];
                h[1] = h[0];
                h[0] = tmp;
                v[1] = h[1];
                break;
            case 2:
                v[3] = h[0];
                h[0] = h[1];
                h[1] = h[2];
                h[2] = tmp;
                v[1] = h[1];
                break;
            case 3:
                v[3] = v[0];
                v[0] = v[1];
                v[1] = v[2];
                v[2] = tmp;
                h[1] = v[1];
                break;
            case 4:
                v[3] = v[2];
                v[2] = v[1];
                v[1] = v[0];
                v[0] = tmp;
                h[1] = v[1];
                break;
        }
        x = nx; y = ny;

        if (g[x][y] == 0) g[x][y] = v[3]; // 지도가 0일 때
        else { // 0이 아님
            v[3] = g[x][y];
            g[x][y] = 0;
        }

        cout << v[1] << '\n';
    }

    return 0;
}
반응형
Comments