주어진 특정 조건을 만족하는 경우, 이웃한 나라의 국경선을 하루간 열어 인구 이동을 진행한다고 할 때, 인구 이동이 총 며칠 동안 발생하는지 구하는 문제.
인구 이동이 더 이상 발생하지 않을 때까지, 배열 a
를 반복하여 탐색한다. 반복 과정에서 이웃한 두 나라가 특정 조건을 만족하는 경우엔 그러한 나라들의 좌표를 벡터 v
에 추가하고, 해당 나라들의 인구 수를 새로운 값으로 초기화한다. 한 번의 인구 이동이 끝날 때마다 cnt
의 값을 1만큼 증가시킨다.
인구 이동이 발생한 이웃 나라가 하나라도 존재하는 경우에 flag
의 값은 1이 되어 반복을 이어가며, 인구 이동이 발생한 이웃 나라가 아예 존재하지 않는 경우에만 flag
의 값은 0이 되어 반복을 종료한다.
#include <bits/stdc++.h>
using namespace std;
const int dy[] = {-1, 0, 1, 0};
const int dx[] = {0, 1, 0, -1};
int n, l, r, a[55][55], visited[55][55], sum, cnt;
vector<pair<int, int>> v;
void dfs(int y, int x) {
visited[y][x] = 1;
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (ny < 0 || ny >= n || nx < 0 || nx >= n || visited[ny][nx]) continue;
if (abs(a[ny][nx] - a[y][x]) >= l && abs(a[ny][nx] - a[y][x]) <= r) {
sum += a[ny][nx];
v.push_back({ny, nx});
dfs(ny, nx);
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> l >> r;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
while (1) {
memset(visited, 0, sizeof(visited));
bool flag = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!visited[i][j]) {
sum = a[i][j];
v.clear();
v.push_back({i, j});
dfs(i, j);
if (v.size() == 1) continue;
for (pair<int, int> b : v) {
a[b.first][b.second] = sum / v.size();
flag = 1;
}
}
}
}
if (!flag) break;
cnt++;
}
cout << cnt << '\n';
return 0;
}
많은 것을 배웠습니다, 감사합니다.