PS/Baekjoon Online Judge

[백준 7569] 토마토 [C]

kimyoungrok 2021. 8. 13. 11:37

백준 - 7569


풀이

"백준 7576, 토마토"에서 좌표축을 하나 추가해주면 된다.


소스코드

#include <stdio.h>
#define MAX 101
int box[MAX][MAX][MAX], M, N, H, rear;
int dx[6] = {-1, 1};
int dy[6] = {0, 0, -1, 1};
int dz[6] = {0, 0, 0, 0, -1, 1};
typedef struct{
    int x, y, z;
}Queue;
Queue q[MAX*MAX*MAX];
void push(int i, int j, int k){
    q[rear].x = i;
    q[rear].y = j;
    q[rear++].z = k;
}
int bfs(int empty){
    if (!empty) return 0;
    int x, y, z, px, py, pz, front = 0;
    while (front != rear){
        x = q[front].x;
        y = q[front].y;
        z = q[front++].z;
        for (int i = 0; i < 6; i++){
            int tx = x+dx[i], ty = y+dy[i], tz = z+dz[i];
            
            if (tx > 0 && ty > 0 && tz > 0 && tx <= N && ty <= M && tz <= H)
                if (!box[tx][ty][tz]){
                    box[tx][ty][tz] = box[x][y][z] + 1;
                    push(tx, ty, tz);
                    empty--;
                    px = tx, py = ty, pz = tz;
                }			
        }
    }
    return empty > 0 ? -1 : box[px][py][pz]-1;
}
int main(){
    int empty = 0;
    scanf("%d %d %d", &M, &N, &H);
    for (int k = 1; k <= H; k++)
        for (int i = 1; i <= N; i++)
            for (int j = 1; j <= M; j++){
                scanf("%d", &box[i][j][k]);
                if (!box[i][j][k]) empty++;
                else if (box[i][j][k] == 1) push(i, j, k);
            }		
    printf("%d", bfs(empty));
}

출처 및 참고자료

 

7569번: 토마토

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

www.acmicpc.net

 

[백준 7576] 토마토 [C]

풀이 "백준 2178, 미로 탐색"과 풀이가 비슷하다. 단, 시작점이 여러개이다. 토마토의 여부를 입력받을 때, 익지않은 토마토의 개수와 익은 토마토의 개수를 미리 계산했다. 익지않은 토마토를 발

kyr-db.tistory.com

'PS > Baekjoon Online Judge' 카테고리의 다른 글

[백준 11723] 집합 [C]  (0) 2021.08.14
[백준 17219] 비밀번호 찾기 [C++]  (0) 2021.08.14
[백준 7576] 토마토 [C]  (0) 2021.08.13
[백준 2178] 미로 탐색 [C]  (0) 2021.08.13
[백준 14860] GCD 곱 [C]  (0) 2021.08.11