https://www.acmicpc.net/problem/2468
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n;
bool visited[101][101];
int map[101][101];
int dr[4] = { 0,0,-1,1 };
int dc[4] = { -1,1,0,0 };
void DFS(int startC, int startR, int num) {
visited[startC][startR] = true;
for (int i = 0; i < 4; i++) {
int nc = startC + dc[i];
int nr = startR + dr[i];
if (nc >= 0 && nc < n&&nr >= 0 && nr < n && !visited[nc][nr]) {
if (map[nc][nr] > num) DFS(nc, nr, num);
}
}
}
int findArea(int num) {
int ret = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (map[i][j] > num && !visited[i][j]) {
ret++;
DFS(i, j,num);
}
}
}
//cout << "높이 " << num << "일때 ret : " << ret << "\n";
return ret;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
int minheight = -1;
int maxheight = -1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j];
if (minheight == -1|| minheight > map[i][j]) minheight = map[i][j];
if (maxheight == -1 || maxheight < map[i][j]) maxheight = map[i][j];
}
}
int ret = 1;
for (int i = minheight; i <= maxheight; i++) {
memset(visited, false, sizeof(visited));
ret=max(ret,findArea(i));
}
cout << ret << "\n";
return 0;
}