백준 7569 토마토

JunSeok·2023년 2월 16일
0

백준

목록 보기
18/40

토마토 문제의 3차원 문제로 전형적인 DFS 문제이다.
3차원이기 때문에 pair가 아닌 STL tuple을 사용했다.
STL tuple 사용 외 특이사항 없는 평범한 문제였다.

  • 아이디어
    • 3차원 토마토 문제
    • 출발지 여러군데, 동시에 출발
    • 상하좌우 + 위와 아래까지 퍼짐
  • 주의할 점
    - 행과 열 입력 순서를 조심하자
#include <bits/stdc++.h>
using namespace std;

int dx[6] = {0, 0, 1, -1, 0, 0};
int dy[6] = {1, -1, 0, 0, 0, 0};
int dz[6] = {0, 0, 0, 0, 1, -1};
int board[103][103][103];
int vis[103][103][103];
int n, m, h;

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> m >> n >> h;
    queue<tuple<int, int, int>> Q;
    for(int k = 0; k < h; k++) {
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                int temp;
                cin >> temp;
                board[i][j][k] = temp;
                if(temp == 1) Q.push({i, j, k});
                if(temp == 0) vis[i][j][k] = -1;
            }
        }
    }
    while(!Q.empty()) {
        auto cur = Q.front(); Q.pop();
        int curX, curY, curZ;
        tie(curX, curY, curZ) = cur;
        for(int dir = 0; dir < 6; dir++) {
            int nx = curX + dx[dir];
            int ny = curY + dy[dir];
            int nz = curZ + dz[dir];
            if(nx < 0 || nx >= n || ny < 0 || ny >= m || nz < 0 || nz >= h) continue;
            if(vis[nx][ny][nz] >= 0) continue;
            vis[nx][ny][nz] = vis[curX][curY][curZ] + 1;
            Q.push({nx, ny, nz});
        }
    }
    int ans = 0;
    for(int k = 0; k < h; k++) {
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(vis[i][j][k] == -1) {
                    cout << -1;
                    return 0;
                }
                ans = max(ans, vis[i][j][k]);
            }
        }
    }
    cout << ans;
    return 0;
}
profile
최선을 다한다는 것은 할 수 있는 한 가장 핵심을 향한다는 것

0개의 댓글