알고리즘/BOJ

[c/c++] 백준/BOJ 7569번 문제 - 토마토

wonjun.Aden 2022. 3. 11. 16:59

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

 

7569번: 토마토

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

www.acmicpc.net

문제

문제풀이

#include<bits/stdc++.h>
using namespace std;

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

//토마토
//보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토 영향받아 익게 됨.
//창고에 보관된 토마토들이 며칠이 지나면 다익게 되는지 최소 일수를 구해라.
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n,m,h;
    cin >> n >> m >> h;

    //x,y,z
    queue<tuple<int,int,int>> Q;

    //값 채우기
    for(int z=0;z<h;z++){
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                cin >> board[i][j][z];

                if(board[i][j][z]==1){
                    Q.push({i,j,z});
                }
                if(board[i][j][z]==0){
                    vis[i][j][z]= -1;
                }

            }
        }
    }

    for(int z=0;z<h;z++){
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                cout << board[i][j][z];
            }
            cout << '\n';
        }
        cout << "==============\n";
    }

    cout << "방문횟수\n";
    for(int z=0;z<h;z++){
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                cout << vis[i][j][z];
            }
            cout << '\n';
        }
        cout << "==============\n";
    }

    //bfs
    while(!Q.empty()){
        auto cur = Q.front();
        Q.pop();
        for(int dir=0;dir < 6;dir++){
            //get()함수를 이용해서 tuple값 가져오기 
            int nx =  get<0>(cur)+ dx[dir];
            int ny = get<1>(cur) + dy[dir];
            int nz = get<2>(cur) + dz[dir];
            //cout << "좌표: "<<nx << ny << nz << '\n';
            if(nx <0 || nx >= m || ny <0 || ny >= n || nz <0 || nz >= h) continue;
            if(vis[nx][ny][nz] >= 0) continue;
            vis[nx][ny][nz] = vis[get<0>(cur)][get<1>(cur)][get<2>(cur)] + 1;
            //cout << "현재 날짜: " << vis[get<0>(cur)][get<1>(cur)][get<2>(cur)] << '\n';
            Q.push({nx,ny,nz});
        }
    }

    int ans = 0;
    for(int z=0;z<h;z++){
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if (vis[i][j][z] == -1) {
                    cout << -1 << "\n";
                    return 0;
                }
                ans = max(ans, vis[i][j][z]);
            }
        }
    }
    cout << ans << "\n";

    return 0;
}

문제의 포인트

반응형