#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= {-1100};
int dy[4= {00-11};
 
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

+ Recent posts