

2468번: 안전 영역
재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는
www.acmicpc.net
[문제 풀이]
BFS를 이용하여 문제를 풀었습니다.
이 문제는 물이 0부터 무한대 높이의 비가 내렸을 때, 상, 하, 좌, 우로 서로 연결된 안전 영역의 최대 개수를 구하는 문제입니다. 안전 영역이란 문제 예제에서 높이가 4인 비가 내렸을 때 (0, 0), (0, 1)의 땅은 침수당하지 않습니다. 따라서, 강수량이 4인 경우 좌표 두 개를 묶어 {(0, 0,), (0, 1)} = 안전 영역 하나가 되는 것입니다.
문제 이해가 끝나셨다면 코드 구현은 어렵지 않습니다. 최소 0부터 최대 = 모두 침수 되는 경우(지역의 최고 높이)까지 반복을 해주시며 BFS를 이용하여 영역 개수만 세우주시면 됩니다.
코드 설명은 일반 BFS를 짜는 것과 유사함으로 생략하겠습니다.
[코드]
#include<iostream>
#include<queue>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N; cin >> N;
int map[101][101];
int max_hight = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
if (max_hight < map[i][j])
max_hight = map[i][j];
}
}
int answer = 0;
for (int test = 0; test <= max_hight; test++) {
int visit[101][101] = { 0, };
queue<pair<int, int>> safe_map;
int cnt = 0;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
if (visit[i][j] == 0 && map[i][j] > test) {
visit[i][j] = 1;
cnt++;
safe_map.push(make_pair(i, j));
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { 1, 0, -1, 0 };
while (!safe_map.empty()) {
int x = safe_map.front().first;
int y = safe_map.front().second;
safe_map.pop();
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= N || ny >= N || visit[nx][ny] == 1 || map[nx][ny] <= test)
continue;
visit[nx][ny] = 1;
safe_map.push(make_pair(nx, ny));
}
}
}
if (answer < cnt)
answer = cnt;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
visit[i][j] = 0;
}
cout << answer << endl;
return 0;
}

'algorithm > BOJ' 카테고리의 다른 글
백준 9205_맥주 마시면서 걸어가기(C++) (0) | 2020.10.28 |
---|---|
백준 2573_빙산(C++) (0) | 2020.10.28 |
백준 5014_스타트링크(C++) (0) | 2020.10.27 |
백준 7569_토마토(C++) (0) | 2020.10.27 |
백준 2644_촌수계산(C++) (0) | 2020.10.26 |