정화 코딩

[C++] 토마토 (백준 7569번) 본문

PS

[C++] 토마토 (백준 7569번)

jungh150c 2024. 5. 16. 01:23

https://www.acmicpc.net/problem/7569

 

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

int dh[6] = {0, 0, 0, 0, 1, -1};
int dn[6] = {1, -1, 0, 0, 0, 0};
int dm[6] = {0, 0, -1, 1, 0, 0};
vector<vector<vector<int>>> box;
int m, n, h;
int t = 0;

bool check() {
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < m; k++) {
                if (box[i][j][k] == 0) {
                    return false;
                }
            }
        }
    }
    return true;
}

void bfs() {
    queue<vector<int>> q;
    
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < m; k++) {
                if (box[i][j][k] == 1) {
                    q.push({i, j, k});
                }
            }
        }
    }

    while (!q.empty()) {
        int tmp = q.size();
        for (int i = 0; i < tmp; i++) {
            vector<int> cur = q.front();
            q.pop();
            for (int x = 0; x < 6; x++) {
                int ni = cur[0] + dh[x];
                int nj = cur[1] + dn[x];
                int nk = cur[2] + dm[x];
                if (ni >= 0 && ni < h && nj >= 0 && nj < n && nk >= 0 && nk < m && box[ni][nj][nk] == 0) {
                    q.push({ni, nj, nk});
                    box[ni][nj][nk] = 1;
                }
            }
        }
        t++;
        if (check()) {
            break;
        }
    }

    if (!check()) {
        t = -1;
    }
}

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

    cin >> m >> n >> h;
    box = vector<vector<vector<int>>>(h, vector<vector<int>>(n, vector<int>(m)));

    for (int i = 0; i < h; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < m; k++) {
                cin >> box[i][j][k];
            }
        }
    }

    if (check()) {
        t = 0;
    }
    else {
        bfs();
    }

    cout << t << '\n';
}

문제를 보자마자 너비 우선 탐색 문제라는 것은 알 수 있었다. 다만 이제 3차원 벡터를 처음 써봐서 헤맨... (정답)

 

큐에서 하나를 꺼낼 때마다 t가 증가하는 것이 아니라 한 타임이 지날 때마다 t가 증가하도록 하려면? while문은 큐에 아무것도 없을 때까지 돌리고 그 안에 있는 for문은 그 순간에 큐에 들어있는 개수만큼 반복하도록 함. t는 for문이 끝날 때마다 증가시킴.

토마토가 전부 익었는지 확인하는 함수가 총 3번 쓰임. 1) 맨처음에 bfs 하기 전에(저장될 때부터 모든 토마토가 익어있는 상태), 2) 매 타임 지날 때마다, 3) 마지막에(토마토가 모두 익지 못하는 상황). ⇒ 따로 check()라는 함수로 만들어서 사용.

 

2024.05.14. 해결

 

'PS' 카테고리의 다른 글

[C++] 유기농 배추 (백준 1012번)  (0) 2024.05.17
[C++] 피보나치 치킨 (백준 13270번)  (0) 2024.05.16
C++과 친해지기  (0) 2024.05.12
C++과 친해지기  (0) 2024.05.04
C++과 친해지기  (0) 2024.04.10
Comments