ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 나무 재테크
    백준알고리즘 2019. 9. 10. 18:14

    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    struct tree{
    	int x, y;
    	int age;
    };
    int n, m, k;
    int dx[] = { 0,0,1,-1,1,1,-1,-1 };
    int dy[] = { 1,-1,0,0,1,-1,1,-1 };
    int map[20][20];//양분!
    int ori[20][20];
    vector<tree> tr;
    vector<tree> death;
    
    void spring() {
    	vector<tree> temping[1001];
    	for (int i = 0; i < tr.size(); i++) {
    		temping[tr[i].age].push_back(tr[i]);
    	}
    	tr.clear();
    	for (int i = 0; i < 1000; i++) {
    		if (temping[i].size() > 0) {
    			for (int j = 0; j < temping[i].size(); j++) {
    				if (ori[temping[i][j].x][temping[i][j].y] - temping[i][j].age >= 0) {
    					ori[temping[i][j].x][temping[i][j].y] -= temping[i][j].age;
    					temping[i][j].age += 1;
    					tr.push_back(temping[i][j]);
    				}
    				else {
    					death.push_back(temping[i][j]);
    				}
    			}
    		}
    	}
    }
    void summer() {
    	if (death.size() != 0) {
    		for (int i = 0; i < death.size(); i++) {
    			int yang = death[i].age / 2;
    			ori[death[i].x][death[i].y] += yang;
    		}
    	}
    	death.clear();
    }
    void atumn() {
    	if (tr.size() != 0) {
    		for (int i = 0; i < tr.size(); i++) {
    			if (tr[i].age % 5 == 0) {
    				for (int j = 0; j < 8; j++) {
    					int nx = tr[i].x + dx[j]; int ny = tr[i].y + dy[j];
    					if (nx >= 1 && nx <= n && ny >= 1 && ny <= n) {
    						tree temping;
    						temping.x = nx; temping.y = ny;
    						temping.age = 1;
    						tr.push_back(temping);
    					}
    				}
    			}
    		}
    	}
    }
    void winter() {
    	for (int i = 1; i <= n; i++) {
    		for (int j = 1; j <= n; j++) {
    			ori[i][j] += map[i][j];
    		}
    	}
    }
    
    
    
    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 >> map[i][j];
    			ori[i][j] = 5;
    		}
    	}
    
    	tree trr;
    
    	for (int i = 0; i < m; i++) {
    		cin >> trr.x >> trr.y >> trr.age;
    		tr.push_back(trr);
    	}
    
    	for (int i = 0; i < k; i++) {
    		spring();
    		summer();
    		atumn();
    		winter();
    	}
    
    	int ans = tr.size();
    	cout << ans << '\n';
    	return 0;
    
    }

     

    시뮬레이션 문제로 , 원래 맵구성 + 추가할 연료 맵을 입력받으면서 진행했고

    나머지는 문제에 나와있는 조건대로 구성했다.

     

    문제가있다면 봄에 양분 흡수 할때인데,

    생각해보면 한스폿에 나무 한개만이있다고 하지않았던것도 있지만, 문제 자체에서

    동일 위치에 다른나무가 있다고 명시를해줬고, 그럴 경우, 나이가 적은 나무 순서대로 양분을 얻어간다는것이다.

    양분을 얻어가는 순서를 구성하는게 생각보다 골치가 아팠는데, 

    구성해봤던 방식은 두가지다.

    첫번째는 스택을 사용해서 스택 탑에 나이가 가장적은게 올수있도록 진행을해봤다. (논리적인 오류가 명확하게 발생함)

    두번째는 위의 풀이와 같이 나이 순서에 따른 벡터배열을 구성해서 벡터 배열 index를 나이에 따라 구성해서, 나이에 맞게 집어넣고, 양분을 먹인 다음 원래있던 벡터에 다시 집어 넣는것이다.

     

    이게 벡터크기나 맵크기가 커지면커질수록 커질텐데, 나무재태크같은경우는 맵도, 그리고 경우의수도 많이작아서 가능하지않았나 싶고, 나이가 최대 1000살까지 가기때문에 벡터왔다갔다하는데 시간도 많이들거라고 생각이들긴했다.

    '백준알고리즘' 카테고리의 다른 글

    경로찾기  (0) 2019.09.16
    텀 프로젝트  (0) 2019.09.16
    미네랄  (0) 2019.09.10
    효율적인 해킹  (0) 2019.09.09
    쇠막대기  (0) 2019.09.08

    댓글

Designed by Tistory.