16234번: 인구 이동
N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모
www.acmicpc.net
구현 문제이자 BFS로서 생각보다 크게 어렵진 않았지만 배열 크기 선언과 범위 설정하느라
계속 틀리다가 맞추었다. N*N으로 배열을 선언해야하는데 그 생각을 못하고 그냥 N으로 선언한 것이 패착이였다.
실제 시험장에서는 항상 변수 선언을 할때 생각을 하면서 해야할거 같다..
풀이는 BFS로 연합의 개수를 세고 각 2차원 배열로 각 연합의 인구수를 계산해서 저장을 해놓고
마지막에 인구수를 나눈 값을 넣어주는 형식으로 구성했다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
int N, L, R, ans, cnt = 1;
int map[51][51];
int visit[51][51];
int people[2555][2];
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { 1, 0, -1, 0 };
queue<pair<int, int>> q;
void bfs(int x, int y) {
q.push({ x, y });
visit[x][y] = cnt;
people[cnt][1]++;
people[cnt][0] += map[x][y];
while (!q.empty()) {
int s = q.size();
for (int i = 0; i < s; i++) {
int a = q.front().first;
int b = q.front().second;
q.pop();
for (int j = 0; j < 4; j++) { //국경을 열 수 있는지 확인
int c = a + dx[j];
int d = b + dy[j];
if (c >= 0 && d >= 0 && c < N && d < N && visit[c][d] == 0
&& abs(map[a][b] - map[c][d]) >= L
&& abs(map[a][b] - map[c][d]) <= R) {
q.push({ c, d });
visit[c][d] = cnt;
people[cnt][0] += map[c][d];
people[cnt][1]++;
}
}
}
}
return;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> L >> R;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
}
}
while (1) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (visit[i][j] == 0) {
bfs(i, j);
cnt++; //연합 갯수 증가
}
}
}
for (int i = 0; i < N; i++) { //연합 안의 사람들 재분배
for (int j = 0; j < N; j++) {
if (visit[i][j] > 0) {
map[i][j] = people[visit[i][j]][0] / people[visit[i][j]][1];
}
}
}
if (cnt > N * N) { //연합의 갯수가 N*N이면 중단
break;
}
ans++;
cnt = 1;
memset(people, 0, sizeof(people)); //배열 초기화
memset(visit, 0, sizeof(visit));
}
cout << ans;
return 0;
}
'알고리즘 공부 > C++' 카테고리의 다른 글
[C++] 백준 15683번: 감시 (0) | 2021.04.08 |
---|---|
[C++] 백준 14499번: 주사위 굴리기 (0) | 2021.03.26 |
[C++] 백준 14500번: 테트로미노 (0) | 2021.03.25 |
[C++] 백준 3190번: 뱀 (0) | 2021.03.19 |
[C++] 백준 13458번: 시험 감독 (0) | 2021.03.17 |