Learnings
#include <iostream>
#define MAX_R 51
#define MAX_C 51
#define AIRCLEANER -1
using namespace std;
int r, c, t;
int dustGrid[MAX_R][MAX_C];
int tempGrid[MAX_R][MAX_C];
// 하, 상, 우, 좌
int ds[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
int airCleaner[2][2] = { {-1, 1}, {-1, 1} };
void Debug() {
cout << endl << "DEBUG" << endl;
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
cout << dustGrid[i][j] << ' ';
}
cout << endl;
}
cout << "DEBUG FIN" << endl;
}
void Init() {
cin >> r >> c >> t;
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
cin >> dustGrid[i][j];
if (dustGrid[i][j] == AIRCLEANER && airCleaner[0][0] == -1) {
airCleaner[0][0] = i, airCleaner[1][0] = i + 1;
}
}
}
}
void DupGrid(int from[MAX_R][MAX_C], int to[MAX_R][MAX_C]) {
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
to[i][j] = from[i][j];
}
}
}
bool InGrid(int i, int j) {
return 1 <= i && i <= r && 1 <= j && j <= c;
}
void Diffuse() {
DupGrid(dustGrid, tempGrid);
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
if (dustGrid[i][j] <= 0) continue;
int diffuseAmount = dustGrid[i][j] / 5;
for (int d = 0; d < 4; d++) {
int ni = i + ds[d][0], nj = j + ds[d][1];
// 공기청정기가 있거나, 칸이 없으면 확산 X
if (!InGrid(ni, nj) || dustGrid[ni][nj] == AIRCLEANER) continue;
tempGrid[ni][nj] += diffuseAmount;
tempGrid[i][j] -= diffuseAmount;
}
}
}
DupGrid(tempGrid, dustGrid);
}
void AirCleaner() {
// 좌측
for (int i = airCleaner[0][0] - 2; i > 0; i--) {
dustGrid[i + 1][1] = dustGrid[i][1];
}
for (int i = airCleaner[1][0] + 2; i <= r; i++) {
dustGrid[i - 1][1] = dustGrid[i][1];
}
// upper-상단, lower-하단
for (int j = 1; j < c; j++) {
dustGrid[1][j] = dustGrid[1][j + 1];
dustGrid[r][j] = dustGrid[r][j + 1];
}
// 우측
for (int i = 1; i < airCleaner[0][0]; i++) {
dustGrid[i][c] = dustGrid[i + 1][c];
}
for (int i = r; i > airCleaner[1][0]; i--) {
dustGrid[i][c] = dustGrid[i - 1][c];
}
// upper - 하단, lower - 상단
for (int j = c; j > 2; j--) {
dustGrid[airCleaner[0][0]][j] = dustGrid[airCleaner[0][0]][j - 1];
dustGrid[airCleaner[1][0]][j] = dustGrid[airCleaner[1][0]][j - 1];
}
dustGrid[airCleaner[0][0]][2] = 0;
dustGrid[airCleaner[1][0]][2] = 0;
}
void GetRemainedDust() {
int totalDust = 0;
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
totalDust += dustGrid[i][j];
}
}
cout << totalDust + 2;
}
int main() {
Init();
for (int sec = 1; sec <= t; sec++) {
// 1. Diffuse
Diffuse();
// 2. AirCleaner
AirCleaner();
}
GetRemainedDust();
return 0;
}