반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 7569 토마토 본문

백준(Baekjoon) 문제

백준 7569 토마토

huiung 2019. 9. 16. 20:19
반응형

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

문제와 채점은 위 사이트에서 확인 하실 수 있습니다

 

이 문제는 박스에 익은 토마토가 있을 때 앞뒤좌우상하의 안익은 토마토를 익게 만들어서 모든 토마토가 익는데 걸리는 날을 구하는 문제입니다.

 

전형적인 bfs 문제이므로 큐를 이용해서 진행해주면 됩니다. 다만 3차원이라서 조금 귀찮은 문제입니다.

 

다음은 코드입니다.

 

#include <iostream>
#include <queue>

using namespace std;

int tomato[101][101][101];
int nextx[6] = {1, -1, 0, 0, 0, 0};
int nexty[6] = {0, 0, 1, -1, 0, 0};
int nexth[6] = {0, 0, 0, 0, 1, -1};
int ans;

struct pos {
    int x,y,h;
};

queue<pos> q;
int M,N,H;

void bfs() {

    while(!q.empty()) {
        int n = q.size();
        bool flag = false;
        for(int i = 0; i < n; i++) {
            int x = q.front().x;
            int y = q.front().y;
            int h = q.front().h;

            q.pop();

            for(int j = 0; j < 6; j++) {
                int xx = x + nextx[j];
                int yy = y + nexty[j];
                int hh = h + nexth[j];

                if(xx < 0 || xx >= M || yy < 0 || yy >= N || hh < 0 || hh >= H)
                    continue;

                if(tomato[hh][yy][xx] == 0) {
                    tomato[hh][yy][xx] = 1;
                    q.push({xx,yy,hh});
                    flag = true;
                }
            }
        }
        if(flag)
            ans++;
    }

}

int main(void) {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    cin >> M >> N >> H;
    bool zero = true;
    for(int i = 0; i < H; i++)
        for(int j = 0; j < N; j++)
            for(int k = 0; k < M; k++) {
                cin >> tomato[i][j][k];
                if(tomato[i][j][k] == 1)
                    q.push({k,j,i});
                if(tomato[i][j][k] == 0)
                    zero = false;

            }
    if(zero)
        cout<<0;
    else {
        bool flag = true;
        bfs();
        for(int i = 0; i < H; i++)
            for(int j = 0; j < N; j++)
                for(int k = 0; k < M; k++)
                    if(tomato[i][j][k] == 0)
                        flag = false;

        if(flag) cout<<ans;
        else cout<<-1<<'\n';
    }
    return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 7579 앱  (6) 2019.10.13
백준 11570 환상의 듀엣  (0) 2019.10.13
백준 16500 문자열 판별  (0) 2019.09.05
백준 14003 가장 긴 증가하는 부분 수열5  (0) 2019.09.05
백준 8979 올림픽  (0) 2019.09.05