주어진 조건에 잘 따라가면서 구현을 해 주면 되는 문제이다. 문제를 꼼꼼히 읽지 않으면 틀리기 쉬운 문제이니 유의해야한다.
주의해야 할 점은 한 위치에 여러 나무가 동시에 존재 할 수 있다는 점이다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
using namespace std;
int n, m, k, answer;
int dx[8] = {-1, -1, -1, 0, 1, 1, 1, 0}, dy[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
int main() {
cin >> n >> m >> k;
vector<vector<int>> A(n, vector<int>(n)), points(n, vector<int>(n, 5));
vector<vector<deque<int>>> trees(n, vector<deque<int>>(n));
for (int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
cin >> A[i][j];
}
}
int x, y, old;
for (int i=0; i<m; i++) {
cin >> x >> y >> old;
trees[x-1][y-1].push_back(old);// 최초 나무 심기
}
while (k--) {
//봄, 여름
deque<pair<int,int> > q;
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
int rotten = 0;// 양분이 되는 나무 수치
for (int k=0; k<trees[i][j].size(); k++) {
if (trees[i][j][k] <= points[i][j]) {
points[i][j] -= trees[i][j][k];
trees[i][j][k]++;
if (trees[i][j][k]%5 == 0) {
q.push_back({i, j});// 나무가 퍼진다면 해당 좌표 저장해준다.
}
} else {
for (int l=k; l<trees[i][j].size(); l++) {
rotten += trees[i][j][l]/2;// 양분 추가
}
trees[i][j].erase(trees[i][j].begin()+k, trees[i][j].end());// 양분이 부족하면 해당 위치부터 뒤쪽까지 다 지워준다.
break;
}
}
points[i][j] += rotten;
}
}
//가을
while (!q.empty()) {// 나무심기
pair<int, int> cur = q.back();
q.pop_back();
for (int dir=0; dir<8; dir++) {
int nx = cur.first + dx[dir], ny = cur.second + dy[dir];
if (nx<0 || ny<0 || nx>=n || ny>=n) continue;
trees[nx][ny].push_front(1);
}
}
//겨울
for (int i=0; i<n; i++) {//양분 추가
for (int j=0; j<n; j++) {
points[i][j] += A[i][j];
}
}
}
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
answer += trees[i][j].size();
}
}
cout << answer << "\n";
}