백준알고리즘

인구 이동

먼지의삶 2019. 7. 17. 23:42

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<vector>
#include<utility>
using namespace std;

int N, L, R;
int a[50][50];
int d[50][50];
bool f[50][50];

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

int mon(int a, int b) {
	int x = a - b;
	int y = b - a;
	if (x < 0)
		return y;
	else return x;
}

void bfs(int x, int y, int recent ) {
	vector<pair<int, int>> v;
	queue<pair<int, int>> q;
	q.push(make_pair(x, y));
	v.push_back(make_pair(x, y));
	int sum = a[x][y];
	d[x][y] = recent;
	f[x][y] = true;
	while (!q.empty()) {
		x = q.front().first; y = q.front().second;
		q.pop();
		for (int i = 0; i < 4; i++) {
			int nx = x + dx[i]; int ny = y + dy[i];
			if (nx >= 0 && nx < N && ny >= 0 && ny < N) {
				if (f[nx][ny] == false) {
					int diff = (a[x][y] - a[nx][ny]);
					if (diff < 0) diff = -1 * diff;
					if(diff >= L && diff <= R){
						d[nx][ny] = recent;
						f[nx][ny] = true;
						sum += a[nx][ny];
						v.push_back(make_pair(nx, ny));
						q.push(make_pair(nx, ny));
					}
				}
			}

		}
	}
	if (v.size() == 1) {
		return;
	}
	else {
		for (int i = 0; i < v.size(); i++) {
			x = v[i].first; y = v[i].second;
			a[x][y] = sum / v.size();
		}
	}
}

void initial() {
	for (int i = 0; i < 50; i++) {
		for (int j = 0; j < 50; j++) {
			d[i][j] = 0;
			f[i][j] = false;
		}
	}
}

int main() {
	scanf("%d %d %d", &N, &L, &R);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			scanf("%d", &a[i][j]);
		}
	}
	int recent = 0;
	bool top = false;
	while (recent < N * N) {
		recent = 0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				if (f[i][j] == false) {
					bfs(i, j, recent);
					recent++;
				}
			}
		}
		if (top == true)
			alp++;
		top = true;
		initial();
	}

	cout << alp<<endl;
	return 0;
}

BFS로 풀이했다, DFS로 해도괜찮았을듯.. 시간이 좀 걸렸던거같은데, 어렵진않았음