본문 바로가기

BOJ

백준 14499 / 주사위 굴리기


뚝배기 굴리기


일단 문제에 낚시가 있다. 통상적으로 '동서남북'이라 말하지만 이 문제에서는 순서가 '동서북남'이다. ㅈ..


주사위를 굴리는 알고리즘을 짜야하는데, 


시뮬레이션 문제는 항상 시간싸움이기 떄문에, 


알고리즘이 생각나지 않는다면 노가다로 때려박는 것이 방법이다.




주사위의 상태를 dice[4][3]의 배열에 담는다 


그리고 항상 dice[1][1]을 바닥 쪽, dice[3][1]를 윗 쪽이라 설정한다.



주사위를 남,북 쪽으로 굴리면 +처럼 생긴 주사위에서 l 에 적힌 숫자만 한칸 씩 바뀐다.


예를 들어 문제에 제시된 주사위 상태에서 남쪽으로 이동한다면 숫자가 밑으로 한칸씩 이동한다


2                6

1     에서     2

5                1

6                5


이런 식으로 4방향 모두 선언해주고 


문제에 주어진대로 맵과 주사위의 상태를 바꾸어준다.


항상 맵 안에서 움직일 수 있을때만 이 행동을 하고,


맵 밖으로 나가는 행동은 하지않고 그 다음 행동으로 넘긴다.





코드


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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<math.h>
 
using namespace std;
 
int dx[] = { 0,0,-1,1 };
int dy[] = { 1,-1,0,0 };
 
int map[21][21];
 
int m, n, sx, sy, k;
 
vector<int>order;
vector<int>ans;
 
int dice[4][3];
 
void go(int x, int y, int doit) {
 
    if (doit == k) {
 
        for (int i = 0; i < ans.size(); i++) {
            cout << ans[i] << endl;
        }
        return;
    }
 
    int dodo = order[doit] - 1;
 
 
 
    int nx = x + dx[dodo];
    int ny = y + dy[dodo];
 
    
 
    if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
    
        // 주사위 상태 바꾸기 
 
        if (dodo == 0) {  // 동
            int one = dice[1][0];
            int two = dice[1][1];
            int three = dice[1][2];
            int four = dice[3][1];
 
            dice[1][0= two;
            dice[1][1= three;
            dice[1][2= four;
            dice[3][1= one;
        }
        if (dodo == 1) {  // 서
            int one = dice[1][0];
            int two = dice[1][1];
            int three = dice[1][2];
            int four = dice[3][1];
 
            dice[1][0= four;
            dice[1][1= one;
            dice[1][2= two;
            dice[3][1= three;
        }
        if (dodo == 2) { // 북
            int one = dice[0][1];
            int two = dice[1][1];
            int three = dice[2][1];
            int four = dice[3][1];
 
            dice[0][1= two;
            dice[1][1= three;
            dice[2][1= four;
            dice[3][1= one;
        }
        if (dodo == 3) {  // 남
            int one = dice[0][1];
            int two = dice[1][1];
            int three = dice[2][1];
            int four = dice[3][1];
 
            dice[0][1= four;
            dice[1][1= one;
            dice[2][1= two;
            dice[3][1= three;
        }
        
        ans.push_back(dice[3][1]); // 맨 위 입력
 
        if (map[nx][ny] == 0) {
            map[nx][ny] = dice[1][1];
        }
        else {
            dice[1][1= map[nx][ny];
            map[nx][ny] = 0;
        }
        
        go(nx, ny,doit + 1);
 
    }
    else {
        go(x, y, doit + 1);
    }
 
 
 
}
int main() {
    //freopen("Text.txt", "r", stdin);
    
    cin >> n >> m >> sx >> sy >> 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++) {
        int tmp;
        cin >> tmp;
        order.push_back(tmp);
    }
 
    go(sx, sy,0);
 
}
cs


'BOJ' 카테고리의 다른 글

백준 14503 / 로봇 청소기  (0) 2019.02.19
백준 3190 / 뱀  (0) 2019.02.18
백준 10422 / 괄호  (0) 2019.02.14
백준 5557 / 1학년  (0) 2019.02.14
백준 1495 / 기타리스트  (0) 2019.02.13