Problem Solving/BOJ
[BOJ] #17144 _ 미세먼지 안녕!
Grini
2019. 10. 22. 20:22
[미세먼지 안녕!] https://www.acmicpc.net/problem/17144
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사과는 뛰어난 코딩 실력을 이용해 각 칸 (r, c)에 있는 미세먼지의 양을 실시간으로 모니터링하는 시스템을 개발했다. (r, c)는 r행 c열을 의미한다. 공기청정기는 항상 왼쪽 열에 설치되어 있고, 크기는 두 행을 차지한다. 공기청정기가 설치되어 있지 않은 칸에는 미세먼
www.acmicpc.net
1초동안 일어나는 일을 그대로 구현하면되는 시뮬레이션 문제이다.
[ 소스 코드 ]
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 51
using namespace std;
int dx[] = { -1,1,0,0 }, dy[] = { 0,0,-1,1 };
int R, C, T;
int map[MAX][MAX], air_fresh[2];
void spreadDust();
void operAirFresh();
int getRestDust();
int main() {
int tmp = 0;
scanf("%d %d %d", &R, &C, &T);
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
scanf("%d", &map[i][j]);
if (map[i][j] == -1) {
air_fresh[tmp++] = i;
map[i][j] = 0;
}
}
}
while (T--) {
spreadDust();
operAirFresh();
}
printf("%d\n", getRestDust());
return 0;
}
void spreadDust() {
int tmp[MAX][MAX] = { 0, };
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
if (map[i][j] == 0) continue;
int cnt = 0;
for (int k = 0; k < 4; k++) {
int tmp_y = i + dy[k], tmp_x = j + dx[k];
if (tmp_x<1 || tmp_y<1 || tmp_x>C || tmp_y>R) continue;
if (tmp_x == 1 && tmp_y == air_fresh[0]) continue;
if (tmp_x == 1 && tmp_y == air_fresh[1]) continue;
tmp[tmp_y][tmp_x] += (map[i][j] / 5);
cnt++;
}
tmp[i][j] += map[i][j] - (map[i][j] / 5)*cnt;
}
}
memcpy(map, tmp, sizeof(map));
}
void operAirFresh() {
for (int i = air_fresh[0] - 1; i > 1; i--) map[i][1] = map[i - 1][1];
for (int i = 1; i < C; i++) map[1][i] = map[1][i + 1];
for (int i = 1; i < air_fresh[0]; i++) map[i][C] = map[i + 1][C];
for (int i = C; i > 1; i--) map[air_fresh[0]][i] = map[air_fresh[0]][i - 1];
for (int i = air_fresh[1] + 1; i <= R; i++) map[i][1] = map[i + 1][1];
for (int i = 1; i < C; i++) map[R][i] = map[R][i + 1];
for (int i = R; i > air_fresh[1]; i--) map[i][C] = map[i - 1][C];
for (int i = C; i > 1; i--) map[air_fresh[1]][i] = map[air_fresh[1]][i - 1];
}
int getRestDust() {
int result = 0;
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
if (map[i][j] <= 0) continue;
result += map[i][j];
}
}
return result;
}