본문 바로가기

BOJ/C++

[BOJ] 14499. 주사위굴리기

[문제]

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

 

[풀이]

 

14499 맞았습니다!! 1992 KB 0 ms C++14 / 수정 1658 B 1일 전

 

1) 주사위가 상하좌우로 굴러간다. 

 

2) 윗면은 1, 좌 4, 우 3, 앞 5 , 밑 6 뒤 2  이 인덱스를 유지한 채로 각 굴러간 방향에 맞는 인덱스를 대입한다. 

 

3) 굴러가게 만들 때 x, y좌표를 함부로 바꾸지 않는다. (x+= , y+= 한 후에 범위 체크를 하면 x, y 값이 이미 바뀌어서 값이 제대로 도출되지 않는다. )

 

4) 주사위가 이동한 칸에 적힌 값이 0이 아니면 주사위에 값이 옮겨지고, 0이라면 주사위의 값이 옮겨진다. 

즉, 주사위 인덱스 5에 값이 옮겨지거나 옮긴다. 

 

5) 출력되는 값은 주사위 0번 인덱스이다. 

 

6) vector를 사용해서 현재 dice의 값을 assign으로 복사해서 사용한다. (값을 유지하면서 쉽게 복사하는 방법)

 

7) x, y좌표를 옮겼으면 그 좌표를 다시 x, y에 대입해주기!

 

* rollingDice() -> 굴러간 주사위에 인덱스 대입해주기 (간단한 인덱스 대입으로 처리)

방향 

북, 남  -> 앞, 뒤, 밑, 위 인덱스만 바꿔준다. 

동, 서 -> 밑, 위 , 좌, 우 인덱스만 바꿔준다. 

 

* moveDice() -> 주사위를 굴린 후에 5번 인덱스 값에 칸에 값을 복사하거나 붙여넣은 후 주사위 0번 인덱스 값을 출력한다. 


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
#include <iostream>
#include <vector>
 
using namespace std;
 
int n, m, r, c, k, map[21][21];
 
 
int dice[6], direct[1002];
 
int dx[4= {0,0,-1,1},dy[4= {1,-1,0,0};
 
//풀이 47분
void rollingDice(int dir) {
    switch (dir)
    {
        int tmp;
    case 0:
        //동쪽 
        tmp = dice[2];
        dice[2= dice[0];
        dice[0]= dice[3];
        dice[3= dice[5];
        dice[5= tmp;
        break;
    case 1 : 
    //서쪽 
     tmp = dice[3];
    dice[3= dice[0];
    dice[0= dice[2];
    dice[2= dice[5];
    dice[5= tmp;
    break;
    case 2 : 
    //북쪽  
     tmp = dice[1];
    dice[1= dice[0];
    dice[0= dice[4];
    dice[4= dice[5];
    dice[5= tmp;
    break;
    case 3 : 
    //남쪽 
     tmp = dice[4];
    dice[4= dice[0];
    dice[0= dice[1];
    dice[1= dice[5];
    dice[5= tmp;
    break;
    default:
        break;
    }
}
void printMap(){
    cout << '\n';
    for (int i = 0; i < n; i++) {
        for(int j = 0; j  < m; j++) {
           cout << map[i][j] << " ";
        }
        cout << '\n';
    }
    cout << '\n';
}
void moveDice() {
 
    for (int i = 0; i < k; i++) {
        int dir = direct[i];
 
        int nx = r + dx[dir];
        int ny = c + dy[dir];
 
        if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
 
        r = nx;
        c = ny;
        //항상 1과 6을 위 아래 면으로 만든다. 
        // 동쪽으로 굴릴 경우  윗면은 서쪽면이 되고 아래는 동쪽면이 된다. 
        //서쪽으로 굴릴 경우 윗면은 동쪽면, 아래면은 서족면이 된다. 
        //북남으로 돌리 ㄹ겨우에는 동 서는 그대로이고 앞 뒤와 위 아래가 바뀐다. 
 
        rollingDice(dir);
        
        if (map[nx][ny] == 0) {
            //주사위에 써진 값이 옮겨간다. 
            map[nx][ny] = dice[5];
           }
        else {
            dice[5= map[nx][ny];
            map[nx][ny] = 0;
        }
        // printMap();
 
        cout << dice[0<< '\n';       
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
 
    cin >> n >> m >> r >> c >> 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;
        direct[i] = tmp-1;
 
    }
    //input 
 
    moveDice();
    
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

'BOJ > C++' 카테고리의 다른 글

[BOJ] 14890. 경사로  (0) 2019.08.02
[BOJ] 14500. 테트로미노  (0) 2019.08.02
[BOJ] 12100. 2048(easy)  (0) 2019.08.01
[BOJ] 3190. 뱀  (0) 2019.08.01
[BOJ] 11066. 파일 합치기  (0) 2019.04.29