PS

7576. 토마토

tose33 2020. 8. 25. 17:46

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

 

7576번: 토마토

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

www.acmicpc.net

 

이전의 bfs를 이용하는 문제인 미로탐색과 거의 같지만 한 가지가 다르다고 볼 수 있다.

미로탐색에서는 출발점에서 시작해서 도착점까지의 탐색이다 즉 출발점이 하나다.

토마토 문제는 1로 표현된 익은 토마토의 갯수가 출발점의 갯수이다.

 

그래서 그냥 출발점을 큐에 넣은 미로탐색 문제와는 다르게 

일단 처음에 저장된 배열에서 이미 익어있는 토마토의 갯수를 세고, 그 토마토를 큐에넣는다.

static boolean bfs() {
        int a = 0, b = 0;
        int trigger_n = 0;
        Queue<Integer> q = new LinkedList<Integer>();

        int unripe = 0; // 안익은 토마토 갯수
        for(int i = 0; i < n; i++) { // 토마토 상태확인
            for(int j = 0; j < m; j++) {
                if(arr[i][j] == 1) {
                    q.add(i); q.add(j);
                    visit[i][j] = 1;
                    trigger_n++;
                }
                if(arr[i][j] == 0) unripe++;
            }
        }

그 후 는 미로탐색이랑 똑같이 출발점들(익어 있는 토마토)에서 부터 bfs탐색을 하면된다.