PS/Baekjoon Online Judge

[백준 7576] 토마토 [C]

kimyoungrok 2021. 8. 13. 11:14
728x90

백준 - 7576


풀이

"백준 2178, 미로 탐색"과 풀이가 비슷하다. 단, 시작점이 여러개이다.

토마토의 여부를 입력받을 때, 익지않은 토마토의 개수와 익은 토마토의 개수를 미리 계산했다.

익지않은 토마토를 발견할 때마다 empty를 하나씩 감소하며, 탐색이 끝난 후 empty가 0보다 크면 모든 토마토가 익을 수 없는 상황이기 때문에 -1을 반환했다.

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

출처 및 참고자료

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

[백준 2178] 미로 탐색 [C]

풀이 (0, 0)부터 범위를 초과하지 않고, 이동할 수 있는 공간이고, 방문한적 없는 곳을 탐색하면 된다. 다음에 이동할 좌표 (tx, ty)를 구조체 q에 저장하고 front, rear을 이용해 탐색을 진행했다. 소스

kyr-db.tistory.com

728x90

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

[백준 17219] 비밀번호 찾기 [C++]  (0) 2021.08.14
[백준 7569] 토마토 [C]  (0) 2021.08.13
[백준 2178] 미로 탐색 [C]  (0) 2021.08.13
[백준 14860] GCD 곱 [C]  (0) 2021.08.11
[백준 4355] 서로소 [C]  (0) 2021.08.11