티스토리 뷰

알고리즘/BOJ

[BOJ 16234] 인구 이동

히더 2019. 1. 9. 17:48

백준 :: BOJ :: 16234 :: 인구 이동


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


#include <bits/stdc++.h>

using namespace std;


struct A { int a, b; };

int N, L, R, f, sum, ans,

arr[50][50], dir[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };

bool vi[50][50];

queue<A> q; vector<A> v;


inline bool check(int i, int j) { return (i >= 0 && j >= 0 && i < N&&j < N) ? true : false; }

inline bool cal(int a, int b) { return (abs(a - b) >= L && abs(a - b) <= R) ? true : false; }


void bfs() {

while (!q.empty()) {

auto tmp = q.front(); q.pop();

for (int d = 0; d < 4; d++) {

int ni = tmp.a + dir[d][0], nj = tmp.b + dir[d][1];

if (check(ni, nj) && !vi[ni][nj] && cal(arr[tmp.a][tmp.b], arr[ni][nj])) {

vi[ni][nj] = 1; q.push({ ni,nj });

v.push_back({ ni,nj }); sum += arr[ni][nj];

}

}

}

}


void ch() {

while (!f) {

f = 1; memset(vi, 0, sizeof(vi));

for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) {

if (!vi[i][j]) {

q.push({ i,j }); vi[i][j] = 1;

v.push_back({ i,j }); sum += arr[i][j]; bfs();

if (v.size() > 1) {

int tra = sum / v.size(); f = 0;

for (int i = 0; i < v.size(); i++) arr[v[i].a][v[i].b] = tra;

}

v.clear(); sum = 0;

}

}

if (!f) ans++;

}

}


int main() {

std::ios::sync_with_stdio(false); cin.tie(0);

cin >> N >> L >> R; ans = 0; sum = 0; f = 0;

for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) cin >> arr[i][j];

ch();

cout << ans;

return 0;

}


'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ 3190] 뱀  (0) 2019.01.21
[BOJ 16235] 나무 재테크  (0) 2019.01.10
[BOJ 16236] 아기 상어  (0) 2019.01.09
[BOJ 5373] 큐빙  (2) 2018.10.25
[BOJ 15686] 치킨 배달  (0) 2018.10.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함