본문 바로가기

문제풀기이야기

14499번_주사위굴리기_BOJ


문제 링크

1449번 주사위 굴리기 : https://www.acmicpc.net/problem/14499




문제 설명 및 해결 아이디어

주사위를 굴리면서 주사위의 윗면에 있는 수를 출력하는 문제이다.



주사위를 굴려 해당 칸의 수가 0이면, 주사위 바닥 면에 있는 수가 칸으로 복사된다.

해당 칸의 수가 0이 아니면, 칸의 수가 주사위 바닥 면으로 복사된다. 그리고 칸의 수는 0으로 갱신된다.



1, 2, 3, 4로 주어진 명령은 각 동쪽, 서쪽, 북쪽, 남쪽으로 주사위를 굴리는 것을 의미한다.

주사위가 굴러가는 것은 네 방향 탐색을 이용했다.

1
2
int dx[] = {00-11 };
int dy[] = {1-100 };
cs



주사위가 특정 방향으로 굴러가게 되면, 양 옆면은 그대로 이고 나머지 네 면만 위치가 바뀌게 되는 꼴이다. 그래서 주사위 각 면의 수를 tdice[7] 배열에 복사를 한 후, 특정 방향으로 이동했을때  각 면에 수를 갱신해준다. 

즉, 주사위 각 면은 인덱스로 고정해두고, 그 값만 이동 후 바뀐 값으로 갱신해주면 된다.




코드


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
#include <cstdio>
using namespace std;
#define MAX_S 25
 
int n, m, px, py, k, a, b, q;
int map[MAX_S][MAX_S];
int dice[7];
 
int dx[] = {00-11 };
int dy[] = {1-100 };
 
bool chk(int x, int y) {
    return x >= 0 && x < n && y >= 0 && y < m;
}
 
void go_east() {
    int tdice[7];
    for (int i = 1; i < 7++i)
        tdice[i] = dice[i];
 
    dice[3= tdice[5];
    dice[5= tdice[4];
    dice[4= tdice[1];
    dice[1= tdice[3];
}
 
void go_west() {
    int tdice[7];
    for (int i = 1; i < 7++i)
        tdice[i] = dice[i];
 
    dice[4= tdice[5];
    dice[5= tdice[3];
    dice[3= tdice[1];
    dice[1= tdice[4];
}
 
void go_north() {
    int tdice[7];
    for (int i = 1; i < 7++i)
        tdice[i] = dice[i];
 
    dice[5= tdice[6];
    dice[6= tdice[1];
    dice[1= tdice[2];
    dice[2= tdice[5];
}
 
void go_south() {
    int tdice[7];
    for (int i = 1; i < 7++i)
        tdice[i] = dice[i];
 
    dice[5= tdice[2];
    dice[2= tdice[1];
    dice[1= tdice[6];
    dice[6= tdice[5];
}
 
void func() {
    if (map[px][py]) {
        dice[1= map[px][py];
        map[px][py] = 0;
    }
    else
        map[px][py] = dice[1];
}
 
int main() {
    scanf("%d %d %d %d %d"&n, &m, &px, &py, &k);
 
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            scanf("%d"&map[i][j]);
        }
    }
 
    for (int i = 0; i < k; ++i) {
        scanf("%d"&q);
        int nx = px + dx[q - 1];
        int ny = py + dy[q - 1];
 
        if (!chk(nx, ny))
            continue;
 
        px = nx;
        py = ny;
 
        if (q == 1)
            go_east();
        else if (q == 2)
            go_west();
        else if (q == 3)
            go_north();
        else if (q == 4)
            go_south();
 
        func();
        printf("%d\n", dice[5]);
    }
    return 0;
}
cs


'문제풀기이야기' 카테고리의 다른 글

2343번_기타 레슨_BOJ  (0) 2018.07.16
2805번_나무 자르기_BOJ  (0) 2018.07.15
1072번_게임_BOJ  (0) 2018.07.15
14502번_연구소_BOJ  (0) 2018.06.25
14503번_로봇 청소기_BOJ  (0) 2018.06.25