-> 풀었음!
height 를 1부터 시작하면 69퍼센트에서 틀림
https://www.acmicpc.net/submit/2468/74824158
height 를 0부터 시작하면 100퍼센트 맞음.
https://www.acmicpc.net/submit/2468/74824189
중요!
원소가 지워지는 것뿐 아니라, 그냥 사이즈 자체가 0이되어 버림...
: 220908 09:34 ~ 10:16
: 비의 양이 얼만큼의 범위를 가지고 동작한다는 말은 없음.
참고 사이트
https://www.acmicpc.net/board/view/96703
처음에는 final을 0으로 설정했음.
하지만, 위의 설명대로 비가 1 이하로 발생한다면?
-> 안전영역은 1임. 즉 최소값은 1부터 시작해야함...
#include <iostream>
using namespace std;
#include <vector>
#include <string>
#include <algorithm>
#include <map>
#include <set>
int n;
// 상하좌우
int dx[]{ 0,0,-1,1 };
int dy[]{ -1,1,0,0 };
bool dfs(vector<vector<int>>&v , vector<vector<bool>>&check,
int height , int sero , int garo)
{
// 테두리 안에서만 돌아야 함.
if ((0 > sero || sero >= n)
|| (0 > garo || garo >= n))
{
return false;
}
if (check[sero][garo] == true)
{
return false;
}
// 높이 검증
if (v[sero][garo] > height)
{
check[sero][garo] = true;
}
// 중요함. 높이 이하인 친구들을 처리해야 함.
else
return false;
for (int i = 0; i < 4; ++i)
{
//if (check[sero][garo] )
//int nx = garo + dx[i];
//int ny = sero + dy[i];
{
dfs(v, check, height, sero + dy[i], garo + dx[i]);
}
}
//cout << "1" << endl;
return true;
}
int main()
{
// n 이하인 지점은 모두 잠김?
// -> n 보다 큰 지점들을 dfs로 돌림.
// n + 1 인곳의 상하좌우를 탐색하면 됨.
// n = 4 -> 5이상인 곳을 탐색함.
cin >> n;
vector<vector<int>>v(n, vector<int>(n));
int mmin = 101;
int mmax = 0;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cin >> v[i][j];
}
mmax = max(mmax, *max_element(v[i].begin(), v[i].end()));
mmin = min(mmin, *min_element(v[i].begin(), v[i].end()));
}
//cout << mmax << " " << mmin << endl;
// min ~ max 높이를 선정하자.
int ffinal = 1;
for (int k = mmin; k < mmax; ++k)
{
vector<vector<bool>>check(n, vector<bool>(n, false));
int res = 0;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
if (check[i][j] == false)
{
if (dfs(v, check, k, i, j))
{
//cout << "2" << endl;
++res;
}
}
}
}
ffinal = max(ffinal, res);
}
cout << ffinal;
}