링크 : https://www.acmicpc.net/problem/14499
주사위를 이용한 시뮬레이션 문제이다.
처음에 이것을 굴리면서 무언가 변하는 규칙이 있을것이라 생각했다. 연습장에 6개의 인덱스를 가지는 배열을 통해 열심히 굴리면서 상, 하, 좌, 후 에 따라 변하는 값과 규칙을 찾으려 했지만 쉽지 않았다. 그렇게 고심하다 다행히 스터디원이 힌트를 주면서 쉽게 해결할 수 있었다.
1차원 배열이 아닌 문제의 그림을 적용하여 3*4의 2차원 배열을 이용하여 상하좌우에 따른 규칙을 바로 그려낼 수 있었다. 이것을 만들고 회전했을 때, 밑면의 위치를 그려냈다면 나머지는 구현하면 된다.
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
103
104
105
106
107
108
109
110
111
112
|
#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
int main()
{
int arr[21][21] = { 0 }, cmd[1010] = { 0 };
int dice[4][3] = { 0 }, ans[4][3] = { 0 };
int n, m, x, y, k, dir = 0;
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", &arr[i][j]);
}
}
for (int i = 0; i < k; i++) scanf("%d", &cmd[i]);
//dice[1][1] = 1, dice[1][0] = 4, dice[0][1] = 2, dice[1][2] = 3, dice[2][1] = 5, dice[3][1] = 6;
//for (int i = 0; i < 4; i++) {
//for (int j = 0; j < 3; j++) {
//printf("%d", dice[i][j]);
//}
//printf("\n");
//}
//printf("\n");
//printf("방향 : %d\n", cmd[0]);
for (int i = 0; i < k; i++) {
int chk = 0;
dir = cmd[i];
if (dir == 1) {
int temp = dice[1][1];
x = x, y = y + 1;
if (x >= 0 && x < n && y >= 0 && y < m) {
dice[1][1] = dice[1][0];
dice[1][0] = dice[3][1];
dice[3][1] = dice[1][2];
dice[1][2] = temp;
}
else {
chk = 1;
y = y - 1;
}
}
else if (dir == 2) {
int temp = dice[1][1];
x = x, y = y - 1;
if (x >= 0 && x < n && y >= 0 && y < m) {
dice[1][1] = dice[1][2];
dice[1][2] = dice[3][1];
dice[3][1] = dice[1][0];
dice[1][0] = temp;
}
else {
chk = 1;
y = y + 1;
}
}
else if (dir == 3) {
int temp = dice[1][1];
x = x - 1, y = y;
if (x >= 0 && x < n && y >= 0 && y < m) {
dice[1][1] = dice[0][1];
dice[0][1] = dice[3][1];
dice[3][1] = dice[2][1];
dice[2][1] = temp;
}
else {
chk = 1;
x = x + 1;
}
}
else if (dir == 4) {
int temp = dice[1][1];
x = x + 1, y = y;
if (x >= 0 && x < n && y >= 0 && y < m) {
dice[1][1] = dice[2][1];
dice[2][1] = dice[3][1];
dice[3][1] = dice[0][1];
dice[0][1] = temp;
}
else {
chk = 1;
x = x - 1;
}
}
if (chk == 1) continue;
else {
if (arr[x][y] == 0) {
arr[x][y] = dice[3][1];
}
else {
dice[3][1] = arr[x][y];
arr[x][y] = 0;
}
printf("%d\n", dice[1][1]);
}
//for (int ii = 0; ii < 4; ii++) {
//for (int jj = 0; jj < 3; jj++) {
//printf("%d ", dice[ii][jj]);
//}
//printf("\n");
//}
}
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'알고리즘 > 삼성 SW역량테스트' 카테고리의 다른 글
백준[17140] 이차원 배열과 연산 (0) | 2019.10.15 |
---|---|
백준[14503] 로봇 청소기 (0) | 2019.08.23 |
백준[3190] 뱀 (0) | 2019.07.07 |
백준 [16234] 인구이동 (0) | 2019.03.16 |
백준[14500] 테트로미노 (0) | 2019.02.17 |