C++:: boj 16235 < 나무 재테크 >

jahlee·2023년 9월 23일
0
post-thumbnail

주어진 조건에 잘 따라가면서 구현을 해 주면 되는 문제이다. 문제를 꼼꼼히 읽지 않으면 틀리기 쉬운 문제이니 유의해야한다.
주의해야 할 점은 한 위치에 여러 나무가 동시에 존재 할 수 있다는 점이다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
using namespace std;

int n, m, k, answer;
int dx[8] = {-1, -1, -1, 0, 1, 1, 1, 0}, dy[8] = {-1, 0, 1, 1, 1, 0, -1, -1};

int main() {
	cin >> n >> m >> k;
	vector<vector<int>> A(n, vector<int>(n)), points(n, vector<int>(n, 5));
	vector<vector<deque<int>>> trees(n, vector<deque<int>>(n));
	for (int i=0; i<n; i++) {
		for(int j=0; j<n; j++) {
			cin >> A[i][j];
		}
	}
	int x, y, old;
	for (int i=0; i<m; i++) {
		cin >> x >> y >> old;
		trees[x-1][y-1].push_back(old);// 최초 나무 심기
	}
	while (k--) {
		//봄, 여름
		deque<pair<int,int> > q;
		for (int i=0; i<n; i++) {
			for (int j=0; j<n; j++) {
				int rotten = 0;// 양분이 되는 나무 수치
				for (int k=0; k<trees[i][j].size(); k++) {
					if (trees[i][j][k] <= points[i][j]) {
						points[i][j] -= trees[i][j][k];
						trees[i][j][k]++;
						if (trees[i][j][k]%5 == 0) {
							q.push_back({i, j});// 나무가 퍼진다면 해당 좌표 저장해준다.
						}
					} else {
						for (int l=k; l<trees[i][j].size(); l++) {
							rotten += trees[i][j][l]/2;// 양분 추가
						}
						trees[i][j].erase(trees[i][j].begin()+k, trees[i][j].end());// 양분이 부족하면 해당 위치부터 뒤쪽까지 다 지워준다.
						break;
					}
				}
				points[i][j] += rotten;
			}
		}
		//가을
		while (!q.empty()) {// 나무심기
			pair<int, int> cur = q.back();
			q.pop_back();
			for (int dir=0; dir<8; dir++) {
				int nx = cur.first + dx[dir], ny = cur.second + dy[dir];
				if (nx<0 || ny<0 || nx>=n || ny>=n) continue;
				trees[nx][ny].push_front(1);
			}
		}
		//겨울
		for (int i=0; i<n; i++) {//양분 추가
			for (int j=0; j<n; j++) {
				points[i][j] += A[i][j];
			}
		}
	}
	for (int i=0; i<n; i++) {
		for (int j=0; j<n; j++) {
			answer += trees[i][j].size();
		}
	}
	cout << answer << "\n";
}

0개의 댓글