#include <iostream>
#include <cstring>
using namespace std;
struct Coord {
int row, col;
};
int n, m, t;
int map[55][55];
int tmpMap[55][55];
Coord up;
Coord down;
int dr[] = { 0, 0, -1, 1 };
int dc[] = { -1, 1, 0, 0 };
void INPUT()
{
cin >> n >> m >> t;
int flag = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> map[i][j];
if (map[i][j] == -1 && flag == 0)
{
flag = 1;
up = { i ,j };
down = { i + 1, j };
}
}
}
}
void CLEAR()
{
n = m = t = 0;
memset(map, 0, sizeof(map));
memset(tmpMap, 0, sizeof(tmpMap));
}
int getSumDust()
{
int sum = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (map[i][j] == -1) continue;
sum += map[i][j];
}
}
return sum;
}
void spreadDust()
{
memset(tmpMap, 0, sizeof(tmpMap));
// 확산
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (map[i][j] < 5) continue;
int tmpDust = map[i][j] / 5;
int sumDust = 0;
for (int k = 0; k < 4; k++)
{
int nextRow = i + dr[k];
int nextCol = j + dc[k];
if (nextRow < 0 || nextCol < 0 || nextRow >= n || nextCol >= m) continue;
if (map[nextRow][nextCol] == -1) continue;
sumDust += tmpDust;
tmpMap[nextRow][nextCol] += tmpDust;
}
map[i][j] -= sumDust;
}
}
// 먼지 더하기
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
map[i][j] += tmpMap[i][j];
}
}
}
void cleanUpside()
{
int tmpOne = map[up.row][m - 1];
for (int i = m - 1; i > 1; i--)
{
map[up.row][i] = map[up.row][i - 1];
}
map[up.row][up.col + 1] = 0;
int tmpTwo = map[0][m - 1];
for (int i = 0; i < up.row - 1; i++)
{
map[i][m - 1] = map[i + 1][m - 1];
}
map[up.row - 1][m - 1] = tmpOne;
tmpOne = map[0][1];
for (int i = 1 ; i < m - 1; i++)
{
map[0][i] = map[0][i + 1];
}
map[0][m - 2] = tmpTwo;
for (int i = up.row - 1; i > 0; i--)
{
map[i][0] = map[i - 1][0];
}
map[0][0] = tmpOne;
}
void cleanDownside()
{
int tmpOne = map[down.row][m - 2];
for (int i = m - 2; i > 1; i--)
{
map[down.row][i] = map[down.row][i - 1];
}
map[down.row][down.col + 1] = 0;
int tmpTwo = map[n - 2][m - 1];
for (int i = n - 2; i > down.row; i--)
{
map[i][m-1] = map[i - 1][m - 1];
}
map[down.row][m - 1] = tmpOne;
tmpOne = map[n - 1][1];
for (int i = 1; i < m - 1; i++)
{
map[n - 1][i] = map[n - 1][i + 1];
}
map[n - 1][m - 1] = tmpTwo;
for (int i = down.row + 1; i < n; i++)
{
map[i][0] = map[i + 1][0];
}
map[n - 1][0] = tmpOne;
}
void cleanDust()
{
cleanUpside();
cleanDownside();
}
void SOLVE()
{
for (int i = 0; i < t; i++)
{
spreadDust();
int debug = 1;
cleanDust();
debug = 0;
}
int debug = 0;
cout << getSumDust() << "\n";
}
int main()
{
CLEAR();
INPUT();
SOLVE();
return 0;
}
📌 memo 😊