티스토리 뷰

알고리즘/백준(BOJ)

백준 - 7569 토마토

시나모온 2020. 6. 11. 17:30

문제 링크입니다 : https://www.acmicpc.net/problem/7569

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

 

 

 

 

 

 

 

 

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

const int dy[6] = {0, 0, -1, 1, 0, 0};
const int dx[6] = {-1, 1, 0, 0, 0, 0};
const int dz[6] = {0, 0, 0, 0, -1, 1};

int N, M, H;
int zeroTomato = 0;
vector<vector<vector<int>>> board;
vector<vector<vector<bool>>> visited;

int bfs(const vector<pair<int, pair<int, int>>>& v) {
    queue<pair<int, pair<int, int>>> q;

    for(int i = 0; i < v.size(); i++) {
        int y = v[i].first;
        int x = v[i].second.first;
        int z = v[i].second.second;
        visited[y][x][z] = true;
        q.push({y, {x, z}});
    }

    int ret = 0;

    while(!q.empty()) {
        int qSize = q.size();

        if(zeroTomato == 0) return ret;
        ret++;
        for(int i = 0; i < qSize; i++) {
            int cy = q.front().first;
            int cx = q.front().second.first;
            int cz = q.front().second.second;
            q.pop();
            for(int dir = 0; dir < 6; dir++) {
                int ny = cy + dy[dir];
                int nx = cx + dx[dir];
                int nz = cz + dz[dir];
                if(ny < 0 || ny >= N || nx < 0 || nx >= M || nz < 0 || nz >= H) continue;
                if(visited[ny][nx][nz]) continue;
                if(board[ny][nx][nz] == 0) {
                    visited[ny][nx][nz] = true;
                    zeroTomato--;
                    q.push({ny, {nx, nz}});
                }
            }

        }

    }


    return -1;
}


int main() {

    cin >> M >> N >> H;
    board.assign(N, vector<vector<int>>(M, vector<int>(H, 0)));
    visited.assign(N, vector<vector<bool>>(M, vector<bool>(H, false)));
    vector<pair<int, pair<int, int>>> v;

    for(int k = 0; k < H; k++) {
        for(int i = 0; i < N; i++) {
            for(int j = 0; j < M; j++) {
                cin >> board[i][j][k];
                if(board[i][j][k] == 0) zeroTomato++;
                else if(board[i][j][k] == 1) v.push_back({i, {j, k}});
            }
        }
    }

    cout << bfs(v);


    return 0;
}

 

 

 

개발 환경 : vscode

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

 

'알고리즘 > 백준(BOJ)' 카테고리의 다른 글

백준 - 2206 벽 부수고 이동하기  (0) 2020.06.11
백준 - 1697 숨바꼭질  (0) 2020.06.11
백준 - 2178 미로 탐색  (0) 2020.06.11
백준 - 1012 유기농 배추  (0) 2020.06.11
백준 - 2667 단지번호붙이기  (0) 2020.06.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/04   »
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
글 보관함