전형적인 DFS 문제이다. 비의 양이 0인 경우도 있다는 것에 주의하면서 0~100까지 DFS를 돌려 가장 큰 안전영역의 개수를 구하는 문제!
풀이보기
```c++
#include <iostream>
int map[101][101];
bool visited[101][101];
int height;
int cnt;
int ans;
int N;
int mR[4] = { -1, 0, 1, 0 };
int mC[4] = { 0, 1, 0, -1 };
void input() {
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
scanf(" %d", &map[i][j]);
}
}
}
void reset() {
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
visited[i][j] = false;
}
}
}
void dfs(int r, int c) {
visited[r][c] = true;
for(int i=0; i<4; i++) {
int nextR = r + mR[i];
int nextC = c + mC[i];
if(nextR>=0 && nextR<N && nextC>=0 && nextC<N) {
if(!visited[nextR][nextC] && map[nextR][nextC] > height) {
dfs(nextR, nextC);
}
}
}
}
int main(int argc, const char * argv[]) {
scanf("%d", &N);
input();
for(int h=0; h<=100; h++) {
height = h;
cnt = 0;
reset();
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(!visited[i][j] && map[i][j] > height) {
cnt++;
// printf("i: %d, j: %d, ans: %d\n",i, j, ans );
dfs(i, j);
}
}
}
cnt > ans ? ans = cnt : ans;
}
printf("%d\n", ans);
return 0;
}
```