알고리즘 문제풀이/백준
[백준 2468] 안전 영역
홍시홍
2020. 1. 13. 01:20
https://www.acmicpc.net/problem/2468
2468번: 안전 영역
재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는 안전한 영역이 최대로 몇 개가 만들어 지는 지를 조사하려고 한다. 이때, 문제를 간단하게 하기 위하여, 장마철에 내리는 비의 양에 따라 일정한 높이 이하의 모든 지점은 물에 잠긴다고 가정한다. 어떤 지역의 높이 정보는 행과 열의 크기가 각각 N인 2차원 배열 형태로 주어
www.acmicpc.net
요구 사항
흩어져 있는 영역이 최대인 장마 높이 구하기
풀이
0에서 100까지 장마 높이를 정하여서 dfs로 흩어져 있는 영역을 구한다
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int n, m;
int map[101][101];
int visit[101][101];
int maxv = 0;
int minv = 101;
int dr[4] = { -1,0,1,0 };
int dc[4] = { 0,-1,0,1 };
void dfs(int r, int c, int k) {
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (nr < 0 || nc < 0 || nr >= n || nc >= n) {
continue;
}
if (map[nr][nc] > k&& visit[nr][nc] == 0) {
visit[nr][nc] = 1;
dfs(nr, nc, k);
}
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &map[i][j]);
maxv = max(maxv, map[i][j]);
minv = min(minv, map[i][j]);
}
}
int ans = 0;
int cnt = 0;
for (int k = 0; k <= 100; k++) {
memset(visit, 0, sizeof(visit));
cnt = 0;
// cout << k << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
{
if (map[i][j] > k && visit[i][j] == 0) {
visit[i][j] = 1;
cnt++;
//cout << cnt << endl;
dfs(i, j, k);
}
}
}
//cout << "cnt" << cnt << endl;
ans = max(cnt, ans);
}
cout << ans << endl;
}