티스토리 뷰

알고리즘/백준

백준 2589 (보물섬) - java

김다미김태리신시아 2022. 12. 27. 01:54

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

 

2589번: 보물섬

보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서

www.acmicpc.net

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    static int n = 0;
    static int m = 0;
    static int[][] board = new int[51][51];

    static int[] dx = {0, 0, -1, 1};
    static int[] dy = {1, -1, 0, 0};
    static Queue<point> land = new LinkedList<>();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] line = br.readLine().split(" ");

        n = Integer.parseInt(line[0]);
        m = Integer.parseInt(line[1]);

        for (int i = 1; i <= n; i++) {
            line = br.readLine().split("");

            for (int j = 1; j <= m; j++) {
                if(line[j-1].equals("W"))
                {
                    board[i][j]=0;
                }
                else {
                    board[i][j]=1;
                    land.add(new point(i,j));
                }
            }
        }

        int min = -1;
        while(!land.isEmpty())
        {
            point cur = land.poll();
            int result = bfs(cur.x,cur.y);
            if(result > min)
                min = result;
        }

        System.out.println(min-1);
        br.close();
    }
    static int bfs(int x,int y)
    {
        int path = 1;
        Queue<point> q = new LinkedList<>();
        int[][] visit = new int[51][51];
        q.add(new point(x,y));
        visit[x][y]=1;

        while(!q.isEmpty())
        {
            point cur = q.poll();
            for(int i=0;i<4;i++)
            {
                int nx = cur.x+dx[i];
                int ny = cur.y+dy[i];

                if(nx>=1&&ny>=1&&nx<=n&&ny<=m)
                {
                    if(board[nx][ny]==1&&visit[nx][ny]==0)
                    {
                        visit[nx][ny]=visit[cur.x][cur.y]+1;
                        if(path<visit[nx][ny])
                            path = visit[nx][ny];

                        q.add(new point(nx,ny));
                    }
                }
            }
        }
        return path;
    }

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

'알고리즘 > 백준' 카테고리의 다른 글

백준 15686 (치킨 배달) java  (0) 2022.12.30
백준 19238 (스타트 택시) java  (0) 2022.12.30
백준 2638 (치즈) - java  (1) 2022.12.27
백준 1303 (전쟁 - 전투) java  (0) 2022.12.06
백준 18405 (경쟁적 전염) java  (0) 2022.12.02