-
[BOJ][C++]16235 나무 제테크Algorithm 2022. 7. 3. 22:47
https://www.acmicpc.net/problem/16235
#include <stdio.h> #include <vector> #include <queue> #include <algorithm> #include <deque> using namespace std; int n, m, k; int a[11][11]; int nutri[11][11]; deque<int> trees[11][11]; int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1}; int dy[] = {0, 1, 1, 1, 0, -1, -1, -1}; int main() { scanf("%d %d %d", &n, &m, &k); for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) { scanf("%d", &a[i][j]); nutri[i][j] = 5; } } for(int i = 0; i < m; ++i) { int x, y, z; scanf("%d %d %d", &x, &y, &z); trees[x][y].push_back(z); } for(int t = 0; t < k; ++t) { // 봄 for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) { int size = trees[i][j].size(); // 양분 먹고 나이 +1 int k = 0; for(; k < trees[i][j].size(); ++k) { if (nutri[i][j] >= trees[i][j][k]) { nutri[i][j] -= trees[i][j][k]; trees[i][j][k]++; } else { break; } } // 여름 // 죽은 나무 있는 곳 양분 추가 for(int p = trees[i][j].size() - 1; p >= k; --p) { nutri[i][j] += trees[i][j][p] / 2; trees[i][j].pop_back(); } } } // 가을 // 나무 번식 for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) { if (trees[i][j].size() > 0) { for(int k = 0; k < trees[i][j].size(); ++k) { if (trees[i][j][k] % 5 == 0) { for(int q = 0; q < 8; ++q) { int nx = i + dx[q]; int ny = j + dy[q]; if (nx < 1 || nx > n || ny < 1 || ny > n) continue; else { trees[nx][ny].push_front(1); // 새로 추가되는 나무를 앞쪽에 넣으면 정렬할 필요 X } } } } } // 겨울 // 양분 추가 nutri[i][j] += a[i][j]; } } } int tree_cnt = 0; for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) { if (trees[i][j].size() > 0) { tree_cnt += trees[i][j].size(); } } } printf("%d\n", tree_cnt); return 0; }
'Algorithm' 카테고리의 다른 글
[BOJ][C++]9019 DSLR (0) 2022.07.11 [BOJ] [C++] AC (0) 2022.07.11 [BOJ][C++] 10989 수 정렬하기 3 (0) 2022.07.03 [BOJ] [C++] 16486 운동장 한 바퀴 (0) 2022.06.26 [BOJ] [C++] 15596 정수 N개의 합 (0) 2022.06.26