설명없음
백준 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] = {1, 0, -1, 0};
int dx[4] = {0, 1, 0, -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] < 1) continue;
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 |