반응형

문제 링크: 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개의 줄에 지

www.acmicpc.net

<문제 풀이> 시뮬레이션

    2

4  1  3

    5

    6

문제에서 나온 주사위를 배열로 표현하면 dice[1] == 윗면, dice[6] == 바닥

 

동쪽으로 굴렸을 때

    2

6   4  1

    5

    3

 

서쪽으로 굴렸을 때

    2

1   3  6

    5

    4

 

북쪽으로 굴렸을 때

    1

4  5  3

    6

    2

 

님쪽으로 굴렸을 때

    6

4  2  3

    1

    5

 

굴리기 전 배열의 값을 temp에 저장해놓고 위에 바뀐 주사위의 상태를 기록하면 됩니다.

배열의 값은 변하지만, 인덱스의 의미는 그대로 주사위의 윗면, 바닥면, 옆면을 의미합니다.

 

<C++ 소스 코드>

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
#include <iostream>
using namespace std;
 
#define EAST 1
#define WEST 2
#define NORTH 3
#define SOUTH 4
 
int N, M, x, y, k;
int board[20][20];
int dice[7]; // 바닥 index = 6
const int dx[5= { 000-11 }; // (1, 2, 3, 4) == (동, 서, 북, 남)
const int dy[5= { 01,-100 };
 
void rotateDice(int dir) {
    int temp[7];
    for (int i = 0; i < 7; i++) temp[i] = dice[i];
    if (dir == EAST) {
        dice[1= temp[4];
        dice[3= temp[1];
        dice[4= temp[6];
        dice[6= temp[3];
    }
    else if (dir == WEST) {
        dice[1= temp[3];
        dice[3= temp[6];
        dice[4= temp[1];
        dice[6= temp[4];
    }
    else if (dir == NORTH) {
        dice[1= temp[5];
        dice[2= temp[1];
        dice[5= temp[6];
        dice[6= temp[2];
    }
    else if (dir == SOUTH) {
        dice[1= temp[2];
        dice[2= temp[6];
        dice[5= temp[1];
        dice[6= temp[5];
    }
}
 
void move(int dir) {
    int nx = x + dx[dir];
    int ny = y + dy[dir];
    if (nx < 0 || ny < 0 || nx >= N || ny >= M) return// 주사위는 지도의 바깥으로 이동시킬 수 없다.
    rotateDice(dir); // 주사위 이동
    if (board[nx][ny] == 0) {//이동한 칸에 쓰여 있는 수가 0이면
        board[nx][ny] = dice[6]; //주사의위 바닥면에 쓰여 있는 수가 칸에 복사된다.
    }
    else {
        dice[6= board[nx][ny]; //칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며,
        board[nx][ny] = 0;  // 칸에 쓰여 있는 수는 0이 된다.
    }
    cout << dice[1]<<'\n';
    x = nx;
    y = ny;
}
 
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    cin >> N >> M >> x >> y >> k;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin>>board[i][j];
        }
    }
    for (int i = 0; i < k; i++) {
        int command; cin >> command;
        move(command);
    }
    return 0;
}
cs

 

반응형

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 2638번] 치즈  (0) 2022.01.17
[백준 16985번] Maaaaaaaaaze  (0) 2022.01.16
[백준 6443번] 애너그램  (0) 2022.01.14
[백준 11559번] Puyo Puyo  (0) 2022.01.13
[백준 15686번] 치킨 배달  (0) 2022.01.09

+ Recent posts