문제 링크:
코드:
/* 1. -1(공기청정기)일 경우에도 skip해야 */
/* 2. 공기청정기는 따로 copy해야 */
/* 3. loop 초기화에 이전 loop 탈출 조건 보정 필요*/
/* 4. r은 갱신 중이므로 탈출 조건에 원본인 prf[0] 사용할 것 */
/* 5. 인덱싱 잘 해라 제발, 배열 넘어가면 런타임 에러 발생, rotation부 안 되면 나머지 주석처리하고 표적 디버깅 */
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int R, C, T;
int map[2][50][50];
bool mi;
vector<int> prf;
int nr, nc;
int buf[200], b;
int ans;
int dr[] = { -1, 0, 1, 0 };
int dc[] = { 0, 1, 0, -1 };
#define IN(r, c) (0 <= (r) && (r) < R && 0 <= (c) && (c) < C)
#define L(x) for (int i = 0; i < (x); ++i)
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> R >> C >> T;
for (int r = 0; r < R; ++r) {
for (int c = 0; c < C; ++c) {
cin >> map[0][r][c];
if (map[0][r][c] == -1)
prf.push_back(r);
}
}
for (int t = 0; t < T; ++t) {
for (int r = 0; r < R; ++r)
fill(map[!mi][r], map[!mi][r] + C, 0);
for (int r = 0; r < R; ++r) {
for (int c = 0; c < C; ++c) {
if (map[mi][r][c] > 0) { /* 1 */
map[!mi][r][c] += map[mi][r][c];
for (int d = 0; d < 4; ++d) {
nr = r + dr[d], nc = c + dc[d];
if (IN(nr, nc) && map[mi][nr][nc] != -1) {
map[!mi][nr][nc] += map[mi][r][c] / 5;
map[!mi][r][c] -= map[mi][r][c] / 5;
}
}
}
}
}
map[!mi][prf[0]][0] = -1; /* 2 */
map[!mi][prf[1]][0] = -1; /* 2 */
mi = !mi;
int r = prf[0], c = 1; b = 0;
L(C - 2) buf[b++] = map[mi][r][c++]; /* 3 */
L(prf[0]) buf[b++] = map[mi][r--][c];
L(C - 1) buf[b++] = map[mi][r][c--];
L(prf[0]) buf[b++] = map[mi][r++][c];
rotate(buf, buf + b - 1, buf + b);
buf[0] = 0;
r = prf[0], c = 1; b = 0;
L(C - 2) map[mi][r][c++] = buf[b++]; /* 3 */
L(prf[0]) map[mi][r--][c] = buf[b++]; /* 4 */
L(C - 1) map[mi][r][c--] = buf[b++];
L(prf[0]) map[mi][r++][c] = buf[b++]; /* 4 */
r = prf[1], c = 1; b = 0;
L(C - 2) buf[b++] = map[mi][r][c++]; /* 3 */
L(R - prf[1] - 1) buf[b++] = map[mi][r++][c];
L(C - 1) buf[b++] = map[mi][r][c--];
L(R - prf[1] - 1) buf[b++] = map[mi][r--][c];
rotate(buf, buf + b - 1, buf + b);
buf[0] = 0;
r = prf[1], c = 1; b = 0;
L(C - 2) map[mi][r][c++] = buf[b++]; /* 3 */
L(R - prf[1] - 1) map[mi][r++][c] = buf[b++];
L(C - 1) map[mi][r][c--] = buf[b++];
L(R - prf[1] - 1) map[mi][r--][c] = buf[b++];
}
for (int r = 0; r < R; ++r)
for (int c = 0; c < C; ++c)
ans += map[mi][r][c];
cout << ans + 2;
return 0;
}