문제 : https://www.acmicpc.net/problem/16235
[ 알고리즘풀이 ]
curMap[x][y] : 현재 (x, y) 지점의 양분
dead[x][y] : (x, y) 지점에 봄에 죽은 나무들의 양분
A[x][y] : (x, y) 지점에 겨울에 추가될 양분
tree[x][y] : (x, y) 지점에 존재하는 나무들의 나이 ( 더 좋은 자료구조가 생각이 안나서, 각 지점마다 vector 배열을 만들어 현재 그 지점에 존재하는 나무들의 나이를 저장했습니다. )
1. Spring
각 지점마다 나무가 존재한다면, 나무들의 나이를 sort해서 어린 나무부터 양분을 줍니다. 이때, 양분이 부족한 나무들을 count 해주고, 나이 순으로 sort가 된 상태고, 어린 나무부터 양분을 주므로 count 만큼 pop_back 을 진행하면 죽은 나무들을 vector 에서 제외할 수 있습니다. 또, 나무가 죽었다면 dead 에 나이 / 2 만큼 양분을 추가해줍니다.
2. Summer
각 지점마다 curMap[x][y] += dead[x][y] 를 진행하고, dead[x][y] = 0 (초기화) 를 진행합니다.
3. Fall
각 지점마다 나무가 존재한다면, 나무들의 나이를 순회하며 나이가 5의 배수인 나무가 있다면 주변에 나무를 추가해줍니다.
4. Winter
각 지점마다 curMap[x][y] += A[x][y] 를 진행해줍니다.
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int N, M, K, curMap[11][11] = {}, dead[11][11] = {}, A[11][11] = {}, x, y, z;
int dx[8] = { -1, -1, -1, 0, 0, 1, 1, 1 }, dy[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
vector<int> tree[11][11] = {};
void spring(void) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (tree[i][j].empty())
continue;
int deadTree = 0;
sort(tree[i][j].begin(), tree[i][j].end());
for (int k = 0; k < tree[i][j].size(); k++) {
if (tree[i][j][k] <= curMap[i][j]) {
curMap[i][j] -= tree[i][j][k];
tree[i][j][k] += 1;
}
else {
dead[i][j] += tree[i][j][k] / 2;
deadTree++;
}
}
for (int k = 0; k < deadTree; k++)
tree[i][j].pop_back();
}
}
}
void summer(void) {
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++){
curMap[i][j] += dead[i][j];
dead[i][j] = 0;
}
}
void fall(void) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (tree[i][j].empty())
continue;
for (int k = 0; k < tree[i][j].size(); k++) {
if (tree[i][j][k] % 5 == 0) {
for (int l = 0; l < 8; l++) {
int x = i + dx[l], y = j + dy[l];
if (1 <= x && x <= N && 1 <= y && y <= N)
tree[x][y].push_back(1);
}
}
}
}
}
}
void winter(void) {
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
curMap[i][j] += A[i][j];
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> N >> M >> K;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++){
cin >> A[i][j];
curMap[i][j] = 5;
}
for (int i = 1; i <= M; i++) {
cin >> x >> y >> z;
tree[x][y].push_back(z);
}
while (K--){
spring();
summer();
fall();
winter();
}
int ans = 0;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
ans += tree[i][j].size();
cout << ans;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 2665 : 미로만들기 - travelbeeee (0) | 2020.02.21 |
---|---|
[BOJ] 11401 : 이항 계수 3 - travelbeeee (0) | 2020.02.20 |
[BOJ] 15683 : 감시 - travelbeeee (0) | 2020.02.20 |
[BOJ] 1074 : Z (코드개선) - travelbeeee (0) | 2020.02.19 |
[BOJ] 1074 : Z - travelbeeee (0) | 2020.02.19 |