728x90
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
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
|
/*
문제 해결 방안:
주사위가 동, 서, 북, 남으로 움직일 때 어떻게 변하는지 코드로 구현한다.
문제의 조건에 따라 주사위의 위치에 보드의 값이 0이면 주사위의 하단 값을 보드로 복사한다.
주사위의 위치에 보드의 값이 0이 아니라면 주사위의 하단 값을 보드의 값으로 복사 한다.
*/
#include <iostream>
using namespace std;
int n, m, sy, sx, k;
int map[20][20];
int dice[6];
const int dy[] = { 0, 0, -1, 1 };
const int dx[] = { 1, -1, 0, 0 };
//동 서 북 남
void move_dice(int dir) {
int ndice[6];
switch (dir) // dir 이
{
case 0: //동쪽인 경우
ndice[0] = dice[0];
ndice[5] = dice[1];
ndice[2] = dice[2];
ndice[4] = dice[3];
ndice[1] = dice[4];
ndice[3] = dice[5];
break;
case 1: //서쪽
ndice[0] = dice[0];
ndice[4] = dice[1];
ndice[2] = dice[2];
ndice[5] = dice[3];
ndice[3] = dice[4];
ndice[1] = dice[5];
break;
case 2: //북쪽
ndice[3] = dice[0];
ndice[0] = dice[1];
ndice[1] = dice[2];
ndice[2] = dice[3];
ndice[4] = dice[4];
ndice[5] = dice[5];
break;
case 3: //남족
ndice[1] = dice[0];
ndice[2] = dice[1];
ndice[3] = dice[2];
ndice[0] = dice[3];
ndice[4] = dice[4];
ndice[5] = dice[5];
break;
default: //그것도 아니면
break;
}
for (int i = 0; i < 6; i++) {
dice[i] = ndice[i]; //임시 배열에 저장해 두었던 값을 다시 주사위에 업데이트 해줌.
}
}
int main() {
cin >> n >> m >> sy >> sx >> k;
for (int y = 0; y < n; y++) {
for (int x = 0; x < m; x++) {
cin >> map[y][x];
}
}
int dir;
for (int i = 0; i < k; i++) { //k만큼 방향 명령 반복
cin >> dir;
dir--;
int ny = sy + dy[dir];
int nx = sx + dx[dir];
if (ny < 0 || ny >= n || nx < 0 || nx >= m) continue; // 범위 밖으로 벗어나면 continue
move_dice(dir); // 방향을 받아서 회전한다.
if (map[ny][nx] == 0) { // 만약 맵의 숫자가 0 이면
map[ny][nx] = dice[3]; // 맵에 주사위 밑 면의 숫자를 복사한다.
}
else {
dice[3] = map[ny][nx]; //0이 아니면 맵의 숫자를 주사위 밑면에 복사
map[ny][nx] = 0; // 맵은 0 처리
}
sy = ny;
sx = nx;
cout << dice[1] << endl;
}
system("pause");
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
728x90
'Algorithm Study > BOJ with C++' 카테고리의 다른 글
(BAEKJOON) 14891번: 톱니바퀴 (0) | 2020.04.20 |
---|---|
(BAEKJOON) 13458번: 시험 감독 (0) | 2020.04.18 |
(BAEKJOON) 14500번: 테트로미노 (0) | 2020.04.17 |
(BAEKJOON) 12100번: 2048(Easy) (0) | 2020.04.16 |
(BAEKJOON) 3190번: 뱀 (0) | 2020.04.16 |
댓글