반응형

https://www.acmicpc.net/problem/16234

 

16234번: 인구 이동

N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모

www.acmicpc.net

 

더 이상 인구 이동이 수행되지 않을 때까지 연합 국가들의 인구를 동일하게 조정해주었습니다.

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
#define MAX 50

int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };

int n, l, r;
int map[MAX][MAX];
int visit[MAX][MAX], v = 1;

int dfs(int x, int y, vector<pair<int, int>>& tmp) {
	int s = map[x][y];
	visit[x][y] = v;
	tmp.push_back({ x, y });
	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];
		if (nx < 0 || ny < 0 || nx >= n || ny >= n || visit[nx][ny] == v) continue;
		int diff = abs(map[x][y] - map[nx][ny]);
		if (diff < l || diff > r) continue;
		s += dfs(nx, ny, tmp);
	}
	return s;
}

int groupingAndReturnSum(int sx, int sy, vector<pair<int, int>>& grp) {
	grp.clear();
	return dfs(sx, sy, grp);
}

bool hasMovableCountry(vector<pair<int, int>>& grp) {
	return grp.size() > 1;
}

int calPopulation(int sum, int grpSize) {
	return sum / grpSize;
}

void updateGroupCountryPopulation(vector<pair<int, int>>& grp, int sum) {
	int population = calPopulation(sum, grp.size());
	for (auto& country : grp) {
		map[country.first][country.second] = population;
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> n >> l >> r;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> map[i][j];
		}
	}

	vector<pair<int, int>> grp;
	while (1) {
		bool finished = true;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (visit[i][j] == v) continue;
				int sum = groupingAndReturnSum(i, j, grp);
				if (hasMovableCountry(grp)) {
					finished = false;
					updateGroupCountryPopulation(grp, sum);
				}
			}
		}
		if (finished) break;
		v++;
	}
	cout << v - 1;
}
반응형

'Algorithm' 카테고리의 다른 글

백준 2866 : 문자열 잘라내기  (0) 2021.11.11
백준 10546 : 배부른 마라토너  (0) 2021.11.11
백준 1700 : 멀티탭 스케줄링  (0) 2021.11.11
백준 9576 : 책 나눠주기  (0) 2021.11.11
백준 1647 : 도시 분할 계획  (0) 2021.11.11

+ Recent posts