용꿀
꼬마개발자허니
용꿀
전체 방문자
오늘
어제
  • 분류 전체보기 (248)
    • 개발 (75)
      • 스프링 입문 (7)
      • 스프링 기본 (9)
      • ToDo List using JPA (2)
      • 스프링 개념 (9)
      • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (8)
      • 스프링 MVC (3)
      • CS (19)
      • 개발 팁 (8)
      • 스프링 MSA (5)
      • 곰터뷰🐻 (5)
    • 알고리즘 (169)
      • 알고리즘 문제 풀이 (165)
    • 잡동사니 (1)
      • 노래 가사 (1)
hELLO · Designed By 정상우.
용꿀

꼬마개발자허니

(C++) 백준 7569번 - 토마토
알고리즘/알고리즘 문제 풀이

(C++) 백준 7569번 - 토마토

2023. 4. 3. 12:15

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

 

7569번: 토마토

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

www.acmicpc.net

풀이

토마토(백준 7576번)의 3차원 버전이다.

2차원과 동일하게 진행하되 체크를 6개의 방향으로 진행하도록 BFS를 구현하면 된다.

#include <iostream>
#include <queue>
#include <tuple>

using namespace std;

int dx[6] = {1,0,0,-1,0,0};
int dy[6] = {0,1,0,0,-1,0};
int dz[6] = {0,0,1,0,0,-1};
int brd[103][103][103];
int dst[103][103][103];
queue<tuple<int,int,int> > Q;

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

    int n, m, h;
    cin >> m >> n >> h;
    
    for(int k = 0; k < h; k++){ // 토마토 저장
        for(int i = 0; i < n; i++){ 
            for(int j = 0; j < m; j++){
                int tomato;
                cin >> tomato;
                if(tomato == 0) dst[i][j][k] = -1; // 익지 않은 토마토의 거리
                if(tomato == 1) Q.push({i, j, k}); // 익은 토마토부터 계산 시작하기 위해 큐에 넣기
                brd[i][j][k] = tomato;               
            }
        }
    }

    while(!Q.empty()){ // 익는데 걸리는 시간을 거리로 생각하여 dist에 저장
        auto cur = Q.front();
        Q.pop();
        int curX, curY, curZ;
        tie(curX, curY, curZ) = cur;
        int prev = dst[curX][curY][curZ]; // 현재 몇 일째인지
        for(int i = 0; i < 6; i++){
            int nx = curX + dx[i];
            int ny = curY + dy[i];
            int nz = curZ + dz[i];
            if (nx < 0 or nx >= n or ny < 0 or ny >= m or nz < 0 or nz >= h) continue; // 유효성 검사
            if (dst[nx][ny][nz] >= 0) continue; // 이미 계산됨
            dst[nx][ny][nz] = prev + 1;
            Q.push({nx, ny, nz});
        }
    }

    int mx = 0;
    for(int k = 0; k < h; k++){
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                if(dst[i][j][k] == -1) { // 익지 않은 토마토가 있다면
                    cout << -1;
                    return 0;
                }
                mx = max(mx, dst[i][j][k]);
            }
        }
    }
    cout << mx;
}

'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글

(C++) 백준 15649번 - N과 M (1)  (0) 2023.04.06
(C++) 백준 13549번 - 숨바꼭질 3  (0) 2023.04.03
(C++) 백준 10026번 - 적록색약  (0) 2023.04.01
(C++) 백준 1074번 - Z  (0) 2023.04.01
(C++) 백준 11729번 - 하노이 탑 이동 순서  (0) 2023.04.01
    '알고리즘/알고리즘 문제 풀이' 카테고리의 다른 글
    • (C++) 백준 15649번 - N과 M (1)
    • (C++) 백준 13549번 - 숨바꼭질 3
    • (C++) 백준 10026번 - 적록색약
    • (C++) 백준 1074번 - Z
    용꿀
    용꿀

    티스토리툴바