백준알고리즘
인구 이동
먼지의삶
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로 해도괜찮았을듯.. 시간이 좀 걸렸던거같은데, 어렵진않았음