알고리즘/DFS & BFS

백준[7576] 토마토

HJ39 2023. 1. 25. 15:48

처음에 접근을 DFS를 이용하여 토마토 집단이 몇 개인지 알아보고 최소일을 구하는 방식으로 접근했는데

BFS에 대한 이해가 부족했던 것 같다.

 

BFS는 queue에 넣고 반복문을 통해 계산을 진행해서 출발 점이 여러 개여도 큐 안에 미리 넣기만 하면 여러 출발점에서도 동작시킬 수 있다.

 

 

#include <bits/stdc++.h>

#define MAXBOXLENGTH 1001
int toM,toN;
int inBoxSize[MAXBOXLENGTH][MAXBOXLENGTH];
queue<pair<int, int>> tomatoQ;
int tomatoMaxTime = 0;

void printResult();

void toBFS(){
    
    int dX[4] = {1,-1,0,0};
    int dY[4] = {0,0,1,-1};
    
    while(!tomatoQ.empty()){
        int x = tomatoQ.front().first;
        int y = tomatoQ.front().second;
        
        tomatoQ.pop();
        
        for(int i=0;i<4;i++){
            int mx = x + dX[i];
            int my = y + dY[i];
            
            if(mx < 0 || my < 0 || mx > toN-1 || my > toM -1)
                continue;
            
            if(inBoxSize[mx][my] == 0){
                inBoxSize[mx][my] = inBoxSize[x][y] + 1;
                if(tomatoMaxTime < inBoxSize[mx][my])
                    tomatoMaxTime = inBoxSize[mx][my];
                
                tomatoQ.push({mx,my});
            }
        }
        
    }
    
    
}

void tomato(){
    cin>>toM>>toN;
    
    for(int i=0;i<toN;i++){
        for(int j=0;j<toM;j++){
            scanf("%d",&inBoxSize[i][j]);
            if(inBoxSize[i][j] == 1){
                tomatoQ.push({i,j});
            }
        }
    }
    
    toBFS();
    
    bool tomatoExist = false;
    for(int i=0;i<toN;i++){
        int *p;
        p = find(&inBoxSize[i][0], &inBoxSize[i][toM], 0);
        if(p != &inBoxSize[i][toM]){
            tomatoExist = true;
            break;
        }
    }
    
    if(tomatoExist)
        cout<<"-1"<<endl;
    else if( tomatoMaxTime == 0)
        cout<<"0"<<endl;
    else
        cout<<tomatoMaxTime -1 <<endl;
  
    
}

'알고리즘 > DFS & BFS' 카테고리의 다른 글

백준[16928] 뱀과 사다리 게임  (0) 2023.01.30
백준[7569] 토마토  (0) 2023.01.27
백준[7562] 나이트의 이동  (0) 2023.01.25
백준[1697] 숨바꼭질  (0) 2023.01.24
백준[2178] 미로 탐색  (0) 2023.01.11