본문 바로가기

시뮬레이션과 구현

주사위 굴리기

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

쓰는 기법 아무것도 없고 그냥 주어진 '상황'에 맞게 시뮬레이션 하면 된다.

대신 철저하게 쓰여진 상황을 다 '구현'해야한다.

만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다.

쓰여있으면? 무조건 코드에 박아야하는거다. 

 

0이면 5
2이면 3
3이면 2
4이면 1
1이면 4
5이면 0


아래가 1일 떄
   1
3 0 2
  4
  5

동으로 갔을 때
   1
0 2 5
  4            
  3



서로 갔을 때
  1
5 3 0
  4  
  2

북으로 갔을 때
   5
3 1 2
  0
  4

남으로 갔을 때
  0
3 4 2
  5
  1

 

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 <cstring>
using namespace std;
 
int n, m;
pair<int, int> now;
int map[22][22];
int command[1000];
int dice[6];
int c_dice[6];
 
/* 동: 1 서: 2 북: 3 남: 4*/
int Judge(int d)
{
    if (d == 1) {
        if (now.second == m - 1) return 0;
    }
    else if (d == 2) {
        if (now.second == 0) return 0;
    }
    else if (d == 3) {
        if (now.first == 0) return 0;
    }
    else if (d == 4) {
        if (now.first == n - 1) return 0;
    }
    return 1;
}
 
void Movement(int d)
{
    memcpy(c_dice, dice, sizeof(dice));
    if (d == 1)
    {
        now.second++;
        dice[0] = c_dice[2];
        dice[3] = c_dice[0];
        dice[2] = c_dice[5];
        dice[5] = c_dice[3];
    }
    else if (d == 2)
    {
        now.second--;
        dice[0] = c_dice[3];
        dice[3] = c_dice[5];
        dice[2] = c_dice[0];
        dice[5] = c_dice[2];
    }
    else if (d == 3)
    {
        now.first--;
        dice[0] = c_dice[1];
        dice[1] = c_dice[5];
        dice[4] = c_dice[0];
        dice[5] = c_dice[4];
    }
    else if (d == 4)
    {
        now.first++;
        dice[0] = c_dice[4];
        dice[1] = c_dice[0];
        dice[4] = c_dice[5];
        dice[5] = c_dice[1];
    }
}
 
 
int main()
{
    cin >> n >> m;
    cin >> now.first >> now.second;
    int k;
    cin >> 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++)
        cin >> command[i];
 
    for (int i = 0; i < k; i++) 
    {
        if (!Judge(command[i])) {
            continue;
        }
 
        Movement(command[i]);
        if (map[now.first][now.second] == 0) {
            map[now.first][now.second] = dice[0];
        }
        else {
            dice[0] = map[now.first][now.second];
            map[now.first][now.second] = 0;
        }
        cout << dice[5] << endl;
    }
    return 0;
}
cs

'시뮬레이션과 구현' 카테고리의 다른 글

경사로  (0) 2023.07.11
컨베이어 벨트 위의 로봇  (0) 2023.05.29
치킨 배달 - 구현 + 조합(재귀)  (0) 2023.05.23
드래곤 커브  (0) 2023.05.23
  (0) 2023.03.18