반응형
https://www.acmicpc.net/problem/16235
완전 시뮬레이션 ..
처음에는 죽는 나무들을 모두 vector erase를 해줬는데.. 계속안되고 오류났는데 이유가
총 배열이 2인 vector 에서 v[2]를 지워주면 v[3]였는애는 v[2] 이 되므로 3번째 자리에 있는 아이를 를 지우려할때 값이 없어서 오류가 난다.
디버깅.. 힘들었다 erase 잘써야 하는 것...
그래서 vSummer의 값에 들어가는 v의n번째에 있는 값 (vSummer의 4번째수) 을 sort해서 큰 수 부터 지운다면 오류가 안나겠지? 했지만 .. 시간초과
그래서 아예 나무가 있는값을 함수 들어갈때마다 초기화하는 vv에 넣어주고 v로 엎어치기 하는 소스를 넣었더니 시간초과가 안났다.
sort... 자주 쓰지 말아야겠다...
매우 구린 소스지만 귀찮아서 수정을 안하고 올린다....
//나무재테크
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
#include <functional>
using namespace std;
int N, M, K , x, y, z;
int map[11][11];
int food[11][11];
vector <int > v[11][11];
vector <pair<pair<int, int>,pair<int, int>>> vSummer;
vector <pair<int, int>> vFall;
//bool cmp(const pair<pair<int, int>, pair<int, int>>& a, const pair<pair<int, int>, pair<int, int>> & b)
//{
// return a.second.second > b.second.second;
//}
void solve() {
//봄
vector <int > vv[11][11];
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
//int vsize = v[i][j].size();
//나무
for (int zz = 0; zz < v[i][j].size(); zz++) {
if (v[i][j][zz] <= map[i][j]) {
//영양제 냠
map[i][j] = map[i][j] - v[i][j][zz];
v[i][j][zz] = v[i][j][zz] + 1;
vv[i][j].push_back(v[i][j][zz]);
if (v[i][j][zz] % 5 == 0 ) {
vFall.push_back({ i,j });
}
}
else {
//죽음
vSummer.push_back({ {i,j},{v[i][j][zz],zz} });
}
}
}
}
//여름
if (vSummer.size() != 0) {
// sort(vSummer.begin(), vSummer.end(), cmp);
for (int i = 0; i < vSummer.size(); i++) {
int nx = vSummer[i].first.first;
int ny = vSummer[i].first.second;
int nz = vSummer[i].second.first;
int zz = vSummer[i].second.second;
map[nx][ny] += (nz/2);
//v[nx][ny].erase(v[nx][ny].begin() + zz);
}
}
//가을
if (vFall.size() != 0) {
for (int i = 0; i < vFall.size(); i++) {
int nx = vFall[i].first;
int ny = vFall[i].second;
if (nx - 1 > 0) vv[nx - 1][ny].push_back(1);
if (ny - 1 > 0) vv[nx][ny - 1].push_back(1);
if (nx + 1 <= N) vv[nx + 1][ny].push_back(1);
if (ny + 1 <= N) vv[nx][ny + 1].push_back(1);
if (nx - 1 > 0 && ny - 1 > 0) vv[nx - 1][ny - 1].push_back(1);
if (nx - 1 > 0 && ny + 1 <= N) vv[nx - 1][ny + 1].push_back(1);
if (nx + 1 <= N && ny - 1 > 0) vv[nx + 1][ny - 1].push_back(1);
if (nx + 1 <= N && ny + 1 <= N) vv[nx + 1][ny + 1].push_back(1);
}
}
//겨울
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
map[i][j] += food[i][j];
}
}
vSummer.clear();
vFall.clear();
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
v[i][j].clear();
for (int z = 0; z < vv[i][j].size(); z++) {
v[i][j].push_back(vv[i][j][z]);
}
}
}
}
int main() {
scanf("%d%d%d", &N, &M, &K);//111
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
scanf("%d", &food[i][j]);
map[i][j] = 5;
}
}
; for (int i = 1; i <= M; i++) {
scanf("%d%d%d", &x, &y, &z);
v[x][y].push_back(z);
}
while(K--){
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (v[i][j].size() > 1) {
sort(v[i][j].begin(), v[i][j].end());
}
}
}
solve();
}
int cnt = 0;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if(v[i][j].size() != 0) cnt += v[i][j].size();
}
}
printf("%d", cnt);
}
반응형
'CS > 알고리즘' 카테고리의 다른 글
백준 17070 파이프 옮기기1 (0) | 2020.10.03 |
---|---|
백준 19238 스타트 택시(우선순위큐) (0) | 2020.10.02 |
백준 1063 킹(시뮬)_String (0) | 2020.05.06 |
백준 17822 원판 돌리기(시뮬) (0) | 2020.05.06 |
백준 17140 이차원 배열과 연산(시뮬) (0) | 2020.05.06 |