설명없음

백준 16234: 인구 이동 [C언어], 삼성 코딩 테스트

치킨먹고싶어요 2022. 6. 13. 13:38

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

 

16234번: 인구 이동

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

www.acmicpc.net

#include <iostream>
using namespace std;
int N, L, R;
int dy[4= {10-10};
int dx[4= {010-1};
int value[2525]; int divi[2525];
int map[55][55];
int mark[55][55];
int last[55][55];
void input();
int solve();
void dfs(int y, int x, int n);
int abs(int a, int b) {
    return (a - b > 0 ? a - b : b - a);
}
int cnt;
int main(){
    input();
    printf("%d", solve());
    return 0;
}
 
void input() {
    scanf("%d %d %d"&N, &L, &R);
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            scanf("%d", map[i] + j); last[i][j] = map[i][j];
        }
    }
}
 
int solve() {
    int count, check, marking;
    for(count = 0;count < 2020; count++) {
        check = 0; marking = 1;
        for(int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                if (mark[i][j]) continue;
                dfs(i, j, marking++);
            }
        }
        for(int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                value[mark[i][j]] += map[i][j];
                divi[mark[i][j]]++;
            }
        }
        for(int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                map[i][j] = value[mark[i][j]] / divi[mark[i][j]];
            }
        }
        for(int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                if (last[i][j] != map[i][j]) {
                    last[i][j] = map[i][j];
                    check++;
                }
                mark[i][j] = 0;
            }
        }
        for(int i = 1; i <= 2500; i++) {
            value[i] = 0; divi[i] = 0;
        }
        if (!check) break;
    }
    return count;
}
void dfs(int y, int x, int n) {
    mark[y][x] = n;
    for(int i = 0; i < 4; i++) {
        if (y + dy[i] > N or y + dy[i] < 1 or x + dx[i] > N or x + dx[i] < 1continue;
        if (abs(map[y][x], map[y + dy[i]][x + dx[i]]) < L) continue;
        if (abs(map[y][x], map[y + dy[i]][x + dx[i]]) > R) continue;
        if (mark[y + dy[i]][x + dx[i]]) continue;
        dfs(y + dy[i], x + dx[i], n);
    }
}
 
cs