https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRF8s6ezEDFAUo
<풀이>
1. 모든 출발 지점에서 모든 방향으로 핀볼을 굴립니다.
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
#include <iostream>
using namespace std;
//북,동,남,서
int di[] = { -1,0,1,0 };
int dj[] = { 0,1,0,-1 };
//방향 반대로 바꾸기
int reverseDir[] = { 2,3,0,1 };
//블록만날때 바뀌는 방향 index
int block[6][4] = {
{0,0,0,0},
{2,3,1,0}, //1번 블록
{1,3,0,2}, //2번 블록
{3,2,0,1}, //3번 블록
{2,0,3,1}, //4번 블록
{2,3,0,1} //5번 블록
};
int N;
int map[102][102];
int res;
int gameStart(int startX, int startY, int startDir) {
//점수
int score = 0;
//위치
int x = startX, y = startY, dir = startDir;
//시뮬레이션
while (true) {
x += di[dir], y += dj[dir];
//5가지 경우(빈칸,블랙홀,벽,블록,웜홀)
//1.빈칸일 경우
if (map[x][y] == 0) {
//시작지점으로 돌아왔을 경우 -> 종료
if (x == startX && y == startY) {
return score;
}
}
//2.블랙홀일 경우 -> 종료
else if (map[x][y] == -1) {
return score;
}
//3.벽일 경우
else if (map[x][y] == -2) {
//방향 반대 전환
dir = reverseDir[dir];
score++;
}
//4.블록일 경우
else if (map[x][y] >= 1 && map[x][y] <= 5) {
//방향 전환
dir = block[map[x][y]][dir];
score++;
}
//5.웜홀일 경우
else {
//위치 변환
bool isChanged = false;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
//맵 위의 값이 같고, 좌표가 다를 경우 -> 다른 웜홀 발견
if ((map[i][j] == map[x][y]) && !(x == i && y == j)) {
x = i, y = j;
isChanged = true;
break;
}
}
if (isChanged) {
break;
}
}
}
}
}
int main() {
int test_case;
int T;
cin >> T;
for (test_case = 1; test_case <= T; test_case++) {
//초기화
for (int i = 0; i < 102; i++) {
for (int j = 0; j < 102; j++) {
map[i][j] = -2;
}
}
res = 0;
//입력
cin >> N;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> map[i][j];
}
}
//핀볼 게임판 전체 탐색
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
//빈칸인 곳에서 핀볼 게임 시작
if (map[i][j] == 0) {
//4방향 모두 굴리기
for (int k = 0; k < 4; k++) {
//gameStart(x좌표, y좌표, 방향)
if (gameStart(i, j, k) > res) {
res = gameStart(i, j, k);
}
}
}
}
}
//출력
cout << "#" << test_case << " " << res << "\n";
}
return 0;
}
|
시뮬레이션에 대해 알아볼 수 있는 문제였습니다.
'알고리즘 문제풀이 > SWEA' 카테고리의 다른 글
[C++] SWEA 2117 - 홈 방범 서비스 (0) | 2020.05.19 |
---|---|
[C++] SWEA 5656 - 벽돌 깨기 (0) | 2020.05.19 |
[C++] SWEA 5644 - 무선 충전 (0) | 2020.05.15 |
[C++] SWEA 2383 - 점심 식사시간 (0) | 2020.05.03 |
[C++] SWEA 2382 - 미생물 격리 (0) | 2020.05.03 |