백준 14499번 - 주사위 굴리기
https://www.acmicpc.net/problem/14499
이 문제는 시뮬레이션 문제이다.
주사위를 지도 안에서 굴리면서 윗면(바닥 면과 반대되는 면)을 출력하는 문제이다.
조건은 다음과 같다.
- 주사위를 굴렸을 때, 이동한 칸에 쓰여있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다.
- 0 이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다.
- 주사위는 지도 바깥으로 이동 불가하며 입력이 들어올 시 해당 입력 무시 및 출력 X
풀이법은 각 이동마다 주사위의 모든 면을 갱신시켜주는 것이 핵심이였다.
구현은 switch문을 통해 동, 서, 남, 북 이동시마다 주사위의 숫자들을 갱신시켰다.
방법은 예를 들어 동쪽으로 이동 시 (바닥면 기준 동,서,남,북 면으로 표현하였다)
바닥면 -> 기존 바닥면의 동쪽 면
윗면 -> 기존 바닥면의 서쪽 면
동쪽 면 -> 기존 바닥면의 윗 면
서쪽면 -> 기존 바닥면
남쪽 면 -> 기존 남쪽면
북쪽 면 -> 기존 북쪽면
이렇게 동, 서, 남, 북으로 이동 시 바뀌는 면들을 코드로 구현하였다.
처음에 문제에서 동, 서, 북, 남 순으로 제시했는데 잘못 읽어서 동, 서, 남, 북으로 표현했다가 시간을 낭비했다.
그리고 질문 검색판을 읽어보니 대부분의 틀린 사람들이 입력 받을 때 x,y를 반대로 입력 받지 않아서 틀렸다고 하던데
나는 처음부터 행렬로 생각하고 풀었기 때문에 x, y 입력에는 문제가 없었다.
(왜 y,x로 입력받아야 되는지 아직도 모르겠음 ㅎㅎ..)
코드는 다음과 같다.
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
|
#include <iostream>
#include <vector>
#pragma warning(disable:4996)
using namespace std;
int map[21][21];
int dx[4] = { 0,0, -1, 1 };
int dy[4] = { 1,-1,0,0 };
int main() {
int n, m, x, y, k;
scanf("%d %d %d %d %d", &n, &m, &x, &y, &k);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &map[i][j]);
}
}
vector<int>move(k);
for (int i = 0; i < k; i++) {
scanf("%d", &move[i]);
}
int cen = 0, north = 0, south = 0, east = 0, west = 0, top = 0;
int nx = x, ny = y;
for (int i = 0; i < k; i++) {
int now = move[i];
nx = nx + dx[now - 1];
ny = ny + dy[now - 1];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) {
nx = nx - dx[now - 1];
ny = ny - dy[now - 1];
continue;
}
int prev_cen = cen, prev_north = north, prev_south = south;
int prev_east = east, prev_west = west, prev_top = top;
switch (now) {
case 1:
cen = prev_east;
west = prev_cen;
east = prev_top;
top = prev_west;
break;
case 2:
cen = prev_west;
west = prev_top;
east = prev_cen;
top = prev_east;
break;
case 3:
cen = prev_north;
north = prev_top;
south = prev_cen;
top = prev_south;
break;
case 4:
cen = prev_south;
north = prev_cen;
south = prev_top;
top = prev_north;
break;
}
if (map[nx][ny] == 0) map[nx][ny] = cen;
else {
cen = map[nx][ny];
map[nx][ny] = 0;
}
printf("%d\n", top);
}
}
|
cs |
동, 서, 남, 북으로 이동 했을 때의 각 면의 숫자들의 변화만 잘 생각해서 짜면 쉽게 풀 수 있을 것이다.
'Koala - 1기' 카테고리의 다른 글
LCS 알고리즘이란? (0) | 2020.12.27 |
---|---|
문자열 - KMP 알고리즘 (0) | 2020.12.27 |
2015~2019 ACM - ICPC 문제별 알고리즘(골드1 ~ 플래, 다이아) (0) | 2020.12.27 |
알고리즘(Algorithm)이란? (0) | 2020.12.27 |
휴리스틱 알고리즘(Heuristic Algorithm) (1) | 2020.12.27 |