https://www.acmicpc.net/problem/2468
안전 영역을 구해줄 것이므로 물에 잠기지 않는 부분에 대해서 BFS를 해준다.
그리고 BFS를 한 횟수가 안전영역의 수가 된다.
지역의 높이 범위가 1부터 100인데 시간을 줄이기 위해서 지역의 정보를 처음에 입력을 받을 때 지역 높이의 최댓값을 구해놓는다.
그리고 1부터 높이의 최댓값 -1 까지만큼 비가 오는 경우를 모두 구해주면 된다.
높이의 최댓값 이상으로 비가 오는 경우는 안전 영역이 0이 되기 때문이다.
그리고 각 경우에서의 안전 영역을 정답(최댓값)과 비교해서 저장한다.
주의할 점은
아무 지역도 물에 잠기지 않을 수도 있다.
라고 문제 밑부분 노트에 쓰여있는데 이 경우는 안전 영역이 1이므로 정답의 초기값은 0이 아닌 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
|
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int n;
int maxh;
int ans;
int map[100][100];
bool check[100][100];
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
void bfs(int x, int y, int h) {
queue<pair<int, int>> q;
q.push(make_pair(x, y));
check[x][y] = true;
while (!q.empty()) {
x = q.front().first;
y = q.front().second;
q.pop();
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;
if (check[nx][ny]) continue;
if (map[nx][ny] <= h) continue;
q.push(make_pair(nx, ny));
check[nx][ny] = true;
}
}
}
void solve() {
for (int h = 1; h < maxh; h++) {
memset(check, false, sizeof(check));
int safearea = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (check[i][j]) continue;
//높이가 더 낮은 곳은 물에 잠기므로 넘어간다
if (map[i][j] <= h) continue;
bfs(i, j, h);
safearea++;
}
}
if (ans < safearea) ans = safearea;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j];
if (maxh < map[i][j]) maxh = map[i][j];
}
}
ans = 1;
solve();
cout << ans << '\n';
return 0;
}
Colored by Color Scripter
|
'BOJ' 카테고리의 다른 글
[BOJ] 17143. 낚시왕 (0) | 2019.08.18 |
---|---|
[BOJ] 17406. 배열 돌리기 4 (0) | 2019.08.13 |
[BOJ] 2573. 빙산 (0) | 2019.08.13 |
[BOJ] 2234. 성곽 (0) | 2019.08.13 |
[BOJ] 11559. Puyo Puyo (0) | 2019.08.08 |