문제 링크 : 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

 

 문제 설명 

 

1. 주사위와 지도가 주어지는데 주사위는 기본 값이 모든면이 0으로 시작하고 지도는 10이하 0이상의 정수가 적혀있다.

2. 지도의 수가 0이면 주사위 바닥면의 숫자가 지도에 복사되고 ,주사위 바닥면이 0 이면 주사위 바닥면에 지도의

   숫자가 복사된다.

3. 주사위는 이동할때마다 윗면의 수를 출력 한다 

 

 알고리즘 

 

주사위 의 단면도 가 이런모양이라고하면 

굴렸을때 단면도를 이런식으로 바뀌게 함수를 만든다

그리고 입력에따라 굴리고 윗면은 6번위치 (arr[5]) 이므로 arr[5]를 출력한다.

 

 코드 

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
#include<iostream>
#include<vector>
using namespace std;
 
int map[21][21];
int N, M, x, y, K;
int dice[6];
int copy_dice[6];
bool mov = false;
vector<int> m;
void move_R() {
    if (x < M - 1) {
        for (int i = 0; i < 6; i++) {
            copy_dice[i] = dice[i];
        }
        dice[0= copy_dice[3];
        dice[2= copy_dice[0];
        dice[3= copy_dice[5];
        dice[5= copy_dice[2];
        x++;
        mov = true;
    }
 
}
void move_L() {
    if (x > 0) {
        for (int i = 0; i < 6; i++) {
            copy_dice[i] = dice[i];
        }
        dice[0= copy_dice[2];
        dice[2= copy_dice[5];
        dice[3= copy_dice[0];
        dice[5= copy_dice[3];
        x--;
        mov = true;
    }
}
void move_U() {
    if (y < N - 1) {
        for (int i = 0; i < 6; i++) {
            copy_dice[i] = dice[i];
        }
        dice[0= copy_dice[1];
        dice[1= copy_dice[5];
 
        dice[4= copy_dice[0];
        dice[5= copy_dice[4];
        y++;
        mov = true;
    }
}
void move_D() {
    if (y > 0) {
        for (int i = 0; i < 6; i++) {
            copy_dice[i] = dice[i];
        }
        dice[0= copy_dice[4];
        dice[1= copy_dice[0];
        dice[4= copy_dice[5];
        dice[5= copy_dice[1];
        y--;
        mov = true;
    }
}
 
 
int main() {
    cin >> N >> M >> y >> x >> 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 num;
        cin >> num;
        mov = false;
        if (num == 1) {
            move_R();
        }
        else if (num == 2) {
            move_L();
        }
        else if (num == 4) {
            move_U();
        }
        else if (num == 3) {
            move_D();
        }
        if (mov) {
            if (map[y][x] == 0) map[y][x] = dice[0];
            else {
                dice[0= map[y][x];
                map[y][x] = 0;
            }
            cout << dice[5<< endl;
        }
    }
}
 
cs

'c++ > 백준' 카테고리의 다른 글

백준 1992번: 쿼드트리  (0) 2020.04.16
백준 1759번 : 암호만들기  (0) 2020.04.16
백준 1780번 : 종이의 개수  (0) 2020.04.14
백준 2805번: 나무 자르기  (0) 2020.04.14
백준 2343번: 기타레슨  (0) 2020.04.14
ariz1623