백준 16235 나무 제테크
백준 16235 나무 제테크
2022년 12월 5일
2022년 12월 5일
cpp, 탐색
문제
문제
풀이
풀이
입력으로 주어지는 나무는 위치당 최대 1개이다.
나무가 새로 생성되는 시기는 기존에 있던 나무의 나이가 모두 증가한 이후에 이루어진다.
새로 생성되는 나무의 나이는 1이므로, 매번 번식에 성공할 때 마다 주어지는 나무의 나이가 해당 위치에서 제일 작은 나이라는 것을 알 수 있다.
따라서 굳이 해당 위치에서의 나무들을 매번 정렬할 필요 없이 나무가 새로 추가될 경우에 제일 앞에 추가만 해주면 된다.
코드
코드
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
int A[12][12];
int feed[12][12];
deque<int> tree[12][12];
queue<pair<int,int>> breed;
int dx[8] = {-1,-1,-1,0,0,1,1,1};
int dy[8] = {-1,0,1,-1,1,-1,0,1};
void solve(){
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j){
if(!tree[i][j].empty()){
int dead = 0;
for(int t=0; t<tree[i][j].size(); ++t){
if(tree[i][j][t] <= feed[i][j]){
feed[i][j] -= tree[i][j][t];
tree[i][j][t]++;
if(tree[i][j][t] % 5 == 0) breed.push({i,j});
} else{
for(int q=tree[i][j].size()-1; q>=t; --q){
// 양분을 못먹는 나무들 제거
dead += tree[i][j][q]/2;
tree[i][j].pop_back();
}
}
}
// 양분 값을 조정하는 것이 다른 위치에 영향을 미치지 않으므로 한번에 진행한다.
feed[i][j] += dead;
}
feed[i][j] += A[i][j];
}
while(!breed.empty()){
auto [x,y] = breed.front(); breed.pop();
for(int dir=0; dir<8; ++dir){
int nx = x + dx[dir];
int ny = y + dy[dir];
if(nx<1||ny<1||nx>=n+1||ny>=n+1) continue;
// 나이가 1인 나무를 심어준다.
tree[nx][ny].push_front(1);
}
}
}
int main()
{
ios::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 >> A[i][j];
// 초기 땅의 양분 5
feed[i][j] = 5;
}
while(m--){
int x,y,z;
cin >> x >> y >> z;
tree[x][y].push_back(z);
}
while(k--) solve();
int cnt = 0;
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
cnt += tree[i][j].size();
cout << cnt;
}
결과Permalink
결과
결과
Copyright © 2024 Hyunghoon Kim