펭로그

[C++] 백준 BOJ 14499 주사위 굴리기 본문

Study/PS(Algorithm)

[C++] 백준 BOJ 14499 주사위 굴리기

노랑펭귄 2018. 9. 18. 01:27

문제링크 : https://boj.kr/14499


이 문제는 약간의 노가다 문제라고 할 수 있겠다.

주사위를 굴릴 때마다 주사위에 써진 숫자의 순서가 뒤바뀌기 때문이다.


방향이 전환 되었을 때마다 어떻게 바뀌는지 전개도를 직접 바꿔보면 아래와 같이 표현 가능하다.


이러한 전개도를 기반으로 다음과 같이 배열을 만들어주고

1
2
3
4
5
6
7
const int s[5][6= {
    {123456}, // 0 기본
    {421653}, // 1 동쪽
    {326154}, // 2 서쪽
    {513462}, // 3 북쪽
    {263415}  // 4 남쪽
};
cs


주사위가 재배치 되었을때 재배치 작업을 거쳐주면 된다.

1
2
3
4
5
6
7
void update(int dir) {
    int tmp[6];
    for (int i = 0; i < 6; i++)
        tmp[i] = dice[i];
    for (int i = 0; i < 6; i++)
        dice[s[dir][i] - 1= tmp[i];
}
cs


이 작업이 생각보다 머리아프고 숫자 실수하게 되면 정말 골치아프게 되버리니 신중하게 작성해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// BOJ 14499 주사위 굴리기
#include <iostream>
#include <vector>
 
using namespace std;
 
int x, y; // 좌표
int dice[6]; // 주사위
vector<vector<int> > arr; // 지도
 
// 전개도
const int s[5][6= {
        {123456}, // 0 기본
        {421653}, // 1 동쪽
        {326154}, // 2 서쪽
        {513462}, // 3 북쪽
        {263415}  // 4 남쪽
};
 
const int dx[5= {000-11};
const int dy[5= {01-100};
 
// 명령 후 주사위 재배치
void update(int dir) {
    int tmp[6];
    for (int i = 0; i < 6; i++)
        tmp[i] = dice[i];
    for (int i = 0; i < 6; i++)
        dice[s[dir][i] - 1= tmp[i];
}
 
// 복사
void copy() {
    if (arr[x][y] == 0)
        arr[x][y] = dice[5];
    else {
        dice[5= arr[x][y];
        arr[x][y] = 0;
    }
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    freopen("../input.txt""r", stdin);
 
    int N, M, num;
    cin >> N >> M >> x >> y >> num;
 
    arr.assign(N + 2vector<int>(M + 2-1));
 
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= M; j++)
            cin >> arr[i][j];
 
    x++, y++// 계산 편의상 1씩 추가
 
    copy(); // 맨 처음 위치 복사
    int cmd, xx, yy;
    while (num--) {
        cin >> cmd;
        xx = x + dx[cmd];
        yy = y + dy[cmd];
        // 맵 범위 체크
        if (arr[xx][yy] == -1)
            continue;
        else
            x = xx, y = yy; // 좌표 업데이트
        update(cmd); // 주사위 업데이트
        copy(); // 복사
        cout << dice[0<< '\n'// 맨 위에 있는 값 출력
    }
 
    return 0;
}
cs


'Study > PS(Algorithm)' 카테고리의 다른 글

[C++] 백준 BOJ 1547 공  (0) 2018.09.18
[C++] 백준 BOJ 3190 뱀  (0) 2018.09.18
[C++] 백준 BOJ 11048 이동하기  (0) 2018.09.17
Codeforces Round #509 (Div. 2) 후기  (0) 2018.09.16
[C++] 백준 BOJ 14503 로봇 청소기  (0) 2018.09.14
Comments