BOJ : https://www.acmicpc.net/problem/16235

 

16235번: 나무 재테크

부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터 떨어진 칸의 개수, c는 가장 왼쪽으로부터 떨어진 칸의 개수이다. r과 c는 1부터 시작한다. 상도는 전자통신공학과 출신답게 땅의 양분을 조사하는 로봇 S2D2를 만들었다. S2D2는 1×1 크기의 칸에 들어있는 양분을 조사해 상도에게 전송하고, 모든

www.acmicpc.net

이 문제를 해결하는데 필요한 알고리즘 : 구현, BFS

 

그냥 문제에 적힌 그대로 따라가면 되는 문제이다.

sort를 잘못된 위치에 적어주면 시간초과가 발생할수 있으니,

어린 나무를 확인해야하는 봄에만 sort를 시켜주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
 
int N, M, K, a, b, c, temp;
int A[11][11]; // A배열은 양분을 저장할 배열
int Aarr[11][11]; // Aarr배열은 현재 양분이 저장되어 있는 배열
int x[] = { -1,-1,-1,0,0,1,1,1 };
int y[] = { -1,0,1,-1,1,-1,0,1 };
int Summer[11][11];
typedef struct _Tree {
    vector<int> tree;
};
 
_Tree Tree[11][11];
 
void spring() {
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (Tree[i][j].tree.size() != 0) {
                sort(Tree[i][j].tree.begin(), Tree[i][j].tree.end());
                for (int k = 0; k < Tree[i][j].tree.size(); k++) {
                    if (Aarr[i][j] >= Tree[i][j].tree[k]) {
                        Aarr[i][j] -= Tree[i][j].tree[k];
                        Tree[i][j].tree[k]++;
                    }
                    else {
                        Summer[i][j] += Tree[i][j].tree[k] / 2;
                        Tree[i][j].tree.erase(Tree[i][j].tree.begin() + k--);
                    }
                }
            }
        }
    }
}
 
void summer() {
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            Aarr[i][j] += Summer[i][j];
            Summer[i][j] = 0;
        }
    }
}
 
void autumn() {
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (Tree[i][j].tree.size() != 0) {
                for (int k = 0; k < Tree[i][j].tree.size(); k++) {
                    if (Tree[i][j].tree[k] % 5 == 0) {
                        for (int h = 0; h < 8; h++) {
                            if (i + x[h] > 0 && i + x[h] <= N && j + y[h] > 0 && j + y[h] <= N) {
                                Tree[i + x[h]][j + y[h]].tree.push_back(1);
                            }
                        }
                    }
                }
            }
        }
    }
}
 
void winter() {
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            Aarr[i][j] += A[i][j];
        }
    }
}
 
int main() {
    scanf("%d%d%d"&N, &M, &K);
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            scanf("%d"&A[i][j]);
            Aarr[i][j] = 5;
        }
    }
    for (int i = 0; i < M; i++) {
        scanf("%d%d%d"&a, &b, &c);
        Tree[a][b].tree.push_back(c);
    }
    while (K--) {
        spring(), summer(), autumn(), winter();
    }
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            temp += Tree[i][j].tree.size();
 
    printf("%d", temp);
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

'algorithm > BOJ' 카테고리의 다른 글

1182번 : 부분수열의 합 - junnnho  (0) 2019.04.07
14502번 : 연구소 - Junnnho  (0) 2019.04.07
BOJ 1463번 1로 만들기  (0) 2019.04.07
BOJ 1965번 상자넣기  (0) 2019.04.07
BOJ 1937번 욕심쟁이 판다  (0) 2019.04.06

+ Recent posts