낭만 IT

반응형

출처

한국정보올림피아드 지역본선 2013 고등부 1번

문제 번호

백준 7576번 토마토
코드업 4781 : 토마토(고등)

힌트

배열에 토마토가 익는 날짜를 저장

 

 

풀이

이 문제 풀이의 핵심은 배열에 토마토가 익는 날짜를 저장한다는 것이다. 익은 토마토의 입력이 1로 들어오기 때문에 day배열에 저장될 숫자는 그 위치의 토마토가 익는 날 +1이 된다. 토마토의 위치를 나타낼 dot 구조체를 만들어주고 dot을 넣을 큐q를 만들어 준다. BFS이기 때문에 가장 먼저 갱신된 값이 날짜의 최소값이다. 따라서 check배열을 만들어 주지 않고 day배열을 check배열처럼 사용할 수 있다.
BFS가 끝나고 day배열에 들어있는 최대값을 찾으면 된다. 만약 0이 남아 있다면 익지 않고 남아있는 토마토가 있는 것이기 때문에 ans를 0으로 바꿔주고 반복문을 탈출한다.day배열에 들어있는 숫자는 그 위치의 토마토가 익는 날 +1이기 때문에 우리가 구한 최대값에서 1을 빼고 출력을 해주어야 한다,

#include<iostream>
#include<queue>
using namespace std;
int day[1000][1000];


int n,m;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};

typedef struct dot{
    int x,y;
};

queue<dot> q;


int main(){

    cin>>n>>m;

    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            cin>>day[i][j];
            if(day[i][j]==1){
                q.push({i,j});
            }
        }
    }

    int date=2;
    while(!q.empty()){
        int size = q.size();
        for(int i=0;i<size;i++){

            int a=q.front().x,b=q.front().y;
            q.pop();

            for(int j=0;j<4;j++){
                int na=a+dir[j][0],nb=b+dir[j][1];
                if(na>=m||nb>=n||na<0||nb<0||day[na][nb]!=0)
                    continue;

                day[na][nb]=date;
                q.push({na,nb});
            }    

        }
        date++;
    }


    int ans=0, flag=0;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(day[i][j]==0){
                flag=1;
                ans=0;
                break;
            }
            ans=max(ans,day[i][j]);
        }

        if(flag)
            break;
    }
    cout<<ans-1;


}

백준 토마토
코드업 토마토

반응형

'Problem Solve > DFS & BFS' 카테고리의 다른 글

[백준] 1023번 유기농 배추 (C)  (0) 2020.03.20
[백준] 2485번 키 순서 (C)  (0) 2020.03.20
[백준] 7596번 토마토 (C)  (0) 2020.03.16
[백준] 2468번 안전영역 (C)  (0) 2020.03.15
[백준] 2615번 오목 (C)  (0) 2020.03.14

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band