티스토리 뷰

알고리즘/백준

백준 4963 (섬의 개수) - java

김다미김태리신시아 2022. 12. 1. 02:25

import java.util.*;
import java.io.*;
import java.awt.Point;
public class Main {
    static int n = 0;
    static int m = 0;
    static int[][] board;
    static int[][] visit;
    static int[] dx = {0,0,-1,1,1,1,-1,-1};
    static int[] dy = {1,-1,0,0,1,-1,1,-1};
    public static void main(String[] args) throws Exception {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        LinkedList<Integer> re = new LinkedList<>();
        while(true) {
            int result = 0;
            StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
            m = Integer.parseInt(st.nextToken());
            n = Integer.parseInt(st.nextToken());
            if(n==0&&m==0)
                break;
            board = new int[51][51];
            visit = new int[51][51];
            for(int i=1;i<=n;i++)
            {
                st = new StringTokenizer(bf.readLine()," ");
                for(int j=1;j<=m;j++)
                {
                    board[i][j] = Integer.parseInt(st.nextToken());
                }
            }

            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    if(visit[i][j]==0&&board[i][j]==1)
                    {
                        bfs(i,j);
                        result =result +1;
                    }
                }
            }
            re.add(result);

        }
        re.forEach(x-> System.out.println(x));
        bf.close();
    }

    static void bfs(int x,int y ) {
       Queue<pair> q = new LinkedList<>();
       q.add(new pair(x,y));
       visit[x][y] = 1;

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

               if(nx>=1&&nx<=n&&ny>=1&&ny<=m)
               {
                   if(visit[nx][ny]==0&&board[nx][ny]==1)
                   {
                       visit[nx][ny]=1;
                       q.add(new pair(nx,ny));
                   }
               }
           }
       }

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

대각선까지 이동을 포함하는 경우에 dx, dy 배열의 형태이다.

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

백준 18405 (경쟁적 전염) java  (0) 2022.12.02
백준 2636 (치즈) java  (0) 2022.12.01
백준 16973 (직사각형 탈출) - java  (0) 2022.11.30
백준 7576 (토마토) java  (0) 2022.11.28
백준 13549 (숨바꼭질3) java  (0) 2022.11.28