이 문제는 바로 직전 문제인, 나무 재테크와 닮아있다. 나무가 번식하는 것과 미세먼지가 확산되는 것이 공통점이다.
공기청정기에 대해 처음 생각한 것은
1. 공기청정기의 위치를 어떻게 저장하는 것이 효율적일까? 이다.
이에 대해 => 그냥 x,y로 두고 미세먼지 확산, 공기청정기 실행을 두개로 나눠야 했다. 시뮬레이션 특성상 queue를 굳이 사용할 필요가 없었다. vector로 충분히 구현가능했으며 특히 나무 재테크는 push_back을 이용하였다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;
int map[51][51];
int b[51][51];
int dx[4] = { 0,-1,0,1 };
int dy[4] = { 1,0,-1,0 };
int r, c, t;
void go(int sx, int sy, int z) {
int prev = 0;
int x = sx;
int y = sy + 1;//공기청정기말고, 그 다음부터 실행해야하니
int k = 0;
while (true) {
if (x == sx && y == sy) break;
swap(prev, map[x][y]);
x += dx[k];
y += dy[k];
if (x < 0 || x >= r || y < 0 || y >= c) {
x -= dx[k];
y -= dy[k];
k += z;
k %= 4;
x += dx[k];
y += dy[k];
}
}
}
int main() {
//freopen("in1.txt", "rt", stdin);
cin >> r >> c >> t;
int x, y;
//x = y = -1;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cin >> map[i][j];
if (map[i][j]==-1) {
x = i;
y = j;
}
//cout << map[i][j] << " " ;
}
//cout << '\n';
}
x -= 1;
while (t--) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (map[i][j] <= 0) continue;
int cnt = 0;
//if (map[i][j] >= 5) {
for (int k = 0; k < 4; k++) {
int xx = i + dx[k];
int yy = j + dy[k];
if (xx >= r || xx < 0 || yy >= c || yy <0) continue;
if(map[xx][yy]>=0) cnt++;
}
//}
if (cnt > 0) {
int val = map[i][j] / 5;
for (int k = 0; k < 4; k++) {
int xx = i + dx[k];
int yy = j + dy[k];
if (xx >= r || xx < 0 || yy >= c || yy < 0) continue;
if (map[xx][yy] >= 0) b[xx][yy] += val;
}
map[i][j] = map[i][j] - cnt * val;
}
}
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (map[i][j] == -1) continue;
map[i][j] += b[i][j];
b[i][j] = 0;
}
}
go(x, y, 1);
go(x + 1, y, 3);
}
int ans = 0;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (map[i][j] >= 0) {
ans += map[i][j];
}
}
}
cout << ans << '\n';
return 0;
}