ํ๋ผ๋ฉํธ๋ฆญ ์์น ๋ฌธ์ . ๋ ๊ตฌ์ญ์ ์ ๋ช ๋์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ฅผ ๋ก ๋๊ณ ์ด๋ถํ์์ ํ๋ฉด ํ ์ ์๋ค.
๊ฐ ๊ตฌ์ญ์ ๋ชจ๋ ์ดํ์ ์ ๋ช ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด ๋ ๊ตฌ์ญ ์ ์ ๋ช ๋ ์ฐจ์ด๊ฐ ์ด์์ด๋ผ๊ณ ํด ๋ณด์. ๋ ์ค ์ ๋ช ๋๊ฐ ๋ ์์ ๊ตฌ์ญ์ธ ๋ฅผ ๋ณด์ ํด์ ๋ก ํค์์ผ ์ฐจ์ด๊ฐ ์ค์ด๋ค ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ๊ฐ ๋ณด๋ค ํฌ๋ค๋ฉด ๋ ๋ณด์ ํด์ผ ํ๋ค. ์ฆ, ์ ๋ช ๋๊ฐ ๋ณด๋ค ์์ ๊ฐ์ด๋ผ๋ฉด ๋ชจ๋ ๋ณด์ ํด์ผ ํ๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ฃผ์ด์ง ์ด๋ฏธ์ง๋ฅผ ์ดํด๋ณด๋ฉด์, ์ธ์ ๊ตฌ์ญ๊ณผ ์ ๋ช
๋ ์ฐจ์ด๊ฐ ๋ณด๋ค ํฐ ๊ตฌ์ญ์ ์ฐพ๊ณ , ๊ฑฐ๊ธฐ์๋ถํฐ bfs ๋๋ฆฌ๋ฉด์ ๋ณด์ ์ ํด ๋๊ฐ์ผํ๋ค.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
constexpr int dy[4] = {1, -1, 0, 0}, dx[4] = {0, 0, 1, -1};
ll N, M, K, X, arr[500][500];
int bfs(int y, int x, ll diff, bool changed[500][500]) {
int ret = 1;
queue<pair<int, int>> q;
q.emplace(y, x);
changed[y][x] = true;
while (!q.empty()) {
auto [y, x] = q.front();
q.pop();
for (int i = 0; i < 4; i++) {
int ny = y + dy[i], nx = x + dx[i];
if (ny >= N || ny < 0 || nx >= M || nx < 0) continue;
if (changed[ny][nx]) continue;
if (arr[ny][nx] < X - diff) {
changed[ny][nx] = true;
q.emplace(ny, nx);
ret++;
}
}
}
return ret;
}
int get_cnt(ll diff) {
int ret = 0;
bool changed[500][500] = {0};
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (arr[i][j] >= X - diff) continue;
if (changed[i][j]) continue;
for (int k = 0; k < 4; k++) {
int ny = i + dy[k], nx = j + dx[k];
if (ny >= N || ny < 0 || nx >= M || nx < 0) continue;
if (abs(arr[i][j] - arr[ny][nx]) > diff) {
ret += bfs(i, j, diff, changed);
break;
}
}
}
}
return ret;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M >> K >> X;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> arr[i][j];
}
}
ll lo = 0, hi = X;
while (lo <= hi) {
ll mid = (lo + hi) / 2;
int cnt = get_cnt(mid);
// cout << mid << ' ' << cnt << '\n';
if (cnt > K) lo = mid + 1;
else hi = mid - 1;
}
cout << lo << '\n';
return 0;
}
๊ฐ์ ์ซ์๊ฐ ๋ฒ์๋ก ์ฃผ์ด์ง๋ฉด ์ด๋ถ ํ์, ๋งค๊ฐ ๋ณ์ ํ์์ ์์ฌํด๋ณด๋๋ก ํ์.