BOJ 16235, 나무 재테크

Source: BOJ 16235 나무 재테크

#include <bits/stdc++.h>
using namespace std;
//봄: 자신의 나이만큼 양분을 먹는다
// 하나의 칸에 여러개의 나무 -> 나이가 어린 나무부터 먹는다
// 먹을수 없으면 죽는다
// 여름: 봄에 죽은 나무가 양분으로 변함, 나이/2 = 양분
// 가을: 나이가 5의 배수인 나무는 번식함. 인접한 8개의 칸에 나이 1인 나무 생성
// 겨울: 양분 추가
//n: 땅의 크기, m: 나무의 개수, k: 구해야하는 년수
int n, m, k;
int a[15][15];
int upd[15][15];
vector<tuple<int, int, int>> v;
int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
bool compare(tuple<int, int, int> a, tuple<int, int, int> b){
  return (get<2>(a) < get<2>(b));
}
int main(){
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin>>n>>m>>k;
  for(int i=1; i<=n; i++){
    for(int j=1; j<=n; j++){
      cin>>upd[i][j];
      a[i][j] = 5;
    }
  }
  while(m--){
    int x, y, z;
    cin>>x>>y>>z;
    v.push_back({x, y, z});
  }
  while(k--){
    vector<tuple<int, int, int>> v1;
    vector<tuple<int, int, int>> v2;
    //봄
    sort(v.begin(),v.end(),compare);
    for(int i=0; i<v.size(); i++){
      int row = get<0>(v[i]);
      int col = get<1>(v[i]);
      int age = get<2>(v[i]);
      if(a[row][col]<age) {v1.push_back({row, col, age}); continue;}
      a[row][col] -= age;
      age++;
      v2.push_back({row, col, age});
    }
    //여름
    for(int i=0; i<v1.size(); i++){
      int row = get<0>(v1[i]);
      int col = get<1>(v1[i]);
      int age = get<2>(v1[i]);
      a[row][col] += age/2;
    }
    //가을
    for(int i=0; i<v2.size(); i++){
      int row = get<0>(v2[i]);
      int col = get<1>(v2[i]);
      int age = get<2>(v2[i]);
      if(age%5) continue;
      for(int dir = 0; dir <8; dir++){
        int nrow = row + dx[dir];
        int ncol = col + dy[dir];
        if(nrow<1||ncol<1||nrow>n||ncol>n)continue;
        v2.push_back({nrow, ncol, 1});
      }
    }
    //겨울
    for(int i=1; i<=n; i++){
      for(int j=1; j<=n; j++){
        a[i][j] += upd[i][j];
      }
    }
    v.clear();
    v.assign(v2.begin(), v2.end());
  }
  cout<<v.size(); 
}**

Categories:

Updated:

Leave a comment