https://www.acmicpc.net/problem/16234
#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 |
'설명없음' 카테고리의 다른 글
백준 15685: 드래곤 커브 [C언어], 삼성 코딩 테스트 (0) | 2022.06.13 |
---|---|
백준 15673: 감시 [C언어], 삼성 코딩 테스트 (0) | 2022.06.13 |
백준 14891: 톱니바퀴 [C언어], 삼성 코딩 테스트 (0) | 2022.06.13 |
백준 14499: 주사위 굴리기 [C언어], 삼성 코딩 테스트 (0) | 2022.06.13 |
백준 16236: 아기 상어 [C언어], 삼성 코딩 테스트 (0) | 2022.06.13 |