Table of Contents

BOJ 7576 해설 C++

Table of Contents

7576번: 토마토

접근 방법

2차원 벡터 값 하나에 토마토가 익을 때 까지 걸린 시간을 기록하는 방법으로 풀 수 있습니다. 주변 토마토 값 = 부모 토마토 값 + 1 을 하면 2차원 벡터 내의 최댓값이 최종 상태까지 걸린 날짜가 됩니다.

코드

 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
95
96
97
98
#include <bits/stdc++.h>

#define debug if constexpr (local) std::cout
#define endl '\\n'
#define fi first
#define se second

#ifdef LOCAL
constexpr bool local = true;
#else
constexpr bool local = false;
#endif

typedef long long ll;
typedef unsigned long long ull;

using namespace std;

/* - GLOBAL VARIABLES ---------------------------- */
int N, M;
int dx[4] = { 0, -1, 1, 0};
int dy[4] = {-1,  0, 0, 1};
/* ----------------------------------------------- */

/* - FUNCTIONS ----------------------------------- */
bool is_out_of_index(int i, int j) {
    if(i < 0 || N <= i)
        return true;

    if(j < 0 || M <= j)
        return true;

    return false;
}
/* ----------------------------------------------- */

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    if constexpr (local) 
        (void)!freopen("input.txt", "r", stdin);

    cin >> M >> N;

		// 입력을 받고 box내 값이 1인 경우 큐에 넣습니다.
    queue<pair<int, int>> q;
    vector<vector<int>> box(N, vector<int>(M, 0));
    for(int i = 0; i < N; ++i) {
        for(int j = 0; j < M; ++j) {
            cin >> box[i][j];
            if(box[i][j] == 1)
                q.push({i, j});
        }
    }

    while(!q.empty()) {
        int y = q.front().fi;
        int x = q.front().se;
				
				// 상, 하, 좌, 우에 대한 반복문
        for(int i = 0; i < 4; ++i) {
            int ny = y + dy[i];
            int nx = x + dx[i];

            if(is_out_of_index(ny, nx))
                continue;

						// 이미 익은 토마토이거나, 빈칸이라면 건너 뜁니다.
            if(box[ny][nx] != 0)
                continue;

						// 주변 토마토들을 부모토마토의 소요 날짜 + 1로 채웁니다.
            q.push({ny, nx});
            box[ny][nx] = box[y][x] + 1;
        }

        q.pop();
    }

    int result = -1e9;
    for(int i = 0; i < N; ++i) {
        for(int j = 0; j < M; ++j) {
						// 값이 0인 칸이 하나라도 존재하면 -1을 출력합니다.
            if(box[i][j] == 0) {
                cout << -1 << endl;
                return 0;
            }

            result = max(box[i][j], result);
        }
    }

		// 소요된 날짜 출력
    cout << result - 1 << endl;

    return 0;
}