Algorithm/inflearn

토마토(BFS 활용)

마닐라 2021. 10. 5. 23:02

 

 

import java.util.*;

class Point {
    public int x, y;
    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class Main {
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};
    static int[][] board, dis;
    static int n, m;
    static Queue<Point> Q = new LinkedList<>();

    public void BFS() {
        while(!Q.isEmpty()) {
            Point tmp = Q.poll();
            //꺼낸 다음 뻗어나가기
            //while이 끝나면 dis배열은 꽉채워져 있다.
            for(int i = 0; i < 4; i++) {
                int nx = tmp.x + dx[i];
                int ny = tmp.y + dy[i];
                //경계선 및 통로 확인
                if(nx >= 0 && ny >= 0 && nx < n && ny < m && board[nx][ny] == 0) {
                    board[nx][ny] = 1;
                    Q.offer(new Point(nx, ny));
                    dis[nx][ny] = dis[tmp.x][tmp.y] + 1;
                }
            }
        }
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        m = kb.nextInt();
        n = kb.nextInt();
        board = new int[n][m];
        dis = new int[n][m];
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                board[i][j] = kb.nextInt();
                //출발점들을 미리 넣어놓아야한다!★★
                //익은 토마토를 넣어놓기!
                if(board[i][j] == 1) Q.offer((new Point(i, j)));
            }
        }
        T.BFS();
        boolean flag = true;
        int answer = Integer.MIN_VALUE;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j <m; j++) {
                //익지 않은 토마토가 있을 때
                if(board[i][j] == 0) flag = false;
            }
        }
        if(flag) {
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < m; j++) {
                    answer = Math.max(answer, dis[i][j]);
                }
            }
            System.out.println(answer);
        } else System.out.println(-1);
    }

}

'Algorithm > inflearn' 카테고리의 다른 글

섬나라 아일랜드(BFS)  (0) 2021.10.05
섬나라 아일랜드(DFS)  (0) 2021.10.05
미로의 최단거리 통로(BFS)  (0) 2021.10.05
미로탐색(DFS)  (0) 2021.10.05
★★★조합 구하기(DFS)  (0) 2021.10.04