#include <stdio.h> #include <iostream> #include <algorithm> #include <vector> using namespace std; int N, treeNum, year; vector<int> tree[15][15]; vector<int> die[15][15]; int food[15][15]; int add_food[15][15]; int ans; int dx[4] = {-1, 1, 0, 0}; int dy[4] = {0, 0, -1, 1}; int safe(int x, int y) { if(x >= 1 && y >= 1 && x <= N && y <= N) { return 1; } else { return 0; } } void spring() { for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { if(tree[i][j].size() != 0) { // 죽는 나무 인덱스 저장 int eraseIdx = -1; // 하나의 칸에 여러 개의 나무가 있다면, 나이가 어린 나무부터 양분을 먹는다. sort(tree[i][j].begin(), tree[i][j].end()); for(int k = 0; k < tree[i][j].size(); k++) { // 나이만큼 양분이 있어야 가능 if(food[i][j] - tree[i][j][k] >= 0) { // 양분 먹음 food[i][j] -= tree[i][j][k]; // 나무가 자신의 나이만큼 양분을 먹고, 나이가 1 증가한다. tree[i][j][k] += 1; } else { eraseIdx = k; break; } } if(eraseIdx != -1) { // 죽은 나무의 나이 저장 for(int k = eraseIdx; k < tree[i][j].size(); k++) { die[i][j].push_back(tree[i][j][k]); } tree[i][j].erase(tree[i][j].begin()+eraseIdx, tree[i][j].end()); } } } } } void summer() { for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { if(die[i][j].size() != 0) { // 각각의 죽은 나무마다 나이를 2로 나눈 값이 나무가 있던 칸에 양분으로 추가된다. for(int k = 0; k < die[i][j].size(); k++) { food[i][j] += die[i][j][k] / 2; } die[i][j].clear(); } } } } void fall() { for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { if(tree[i][j].size() != 0) { // 번식하는 나무는 나이가 5의 배수이어야 하며, 인접한 8개의 칸에 나이가 1인 나무가 생긴다. for(int k = 0; k < tree[i][j].size(); k++) { if(tree[i][j][k] % 5 == 0) { for(int m = i-1; m <= i+1; m++) { for(int n = j-1; n <= j+1; n++) { if(m == i && n == j) { continue; } if(safe(m, n) == 1) { tree[m][n].push_back(1); } } } } } } } } } void winter() { for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { food[i][j] += add_food[i][j]; } } } int main(void) { // freopen("B15685_input.txt", "r", stdin); ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N >> treeNum >> year; for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { food[i][j] = 5; cin >> add_food[i][j]; } } for(int i = 1; i <= treeNum; i++) { int x, y, age; cin >> x >> y >> age; tree[x][y].push_back(age); } while(year--) { spring(); summer(); fall(); winter(); } for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { ans += tree[i][j].size(); } } cout << ans; return 0; } | cs |
'Baekjoon > Simulation' 카테고리의 다른 글
[백준 13458] 시험감독 (Simulation) (C/C++) (0) | 2020.04.09 |
---|---|
[백준 14891] 톱니바퀴 (Simulation) (C/C++) (★) (0) | 2020.04.09 |
[백준 15685] 드래곤 커브 (Simulation) (C/C++) (★★) (0) | 2020.03.27 |
[백준 14890] 경사로 (Simulation) (C/C++) (★★) (0) | 2020.03.27 |
[백준 14503] 로봇 청소기 (Simulation) (C/C++) (★★) (0) | 2020.03.27 |