본문 바로가기

Algo/백준

4963: 섬의 개수 (그래프)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static int W, H;
	static int[] dx = { -1, 1, 0, 0, -1, -1, 1, 1 };
	static int[] dy = { 0, 0, -1, 1, -1, 1, 1, -1 };
	static int[][] arr;
	static boolean[][] visited;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuffer buf = new StringBuffer();

		while (true) {
			st = new StringTokenizer(br.readLine());

			W = Integer.parseInt(st.nextToken());
			H = Integer.parseInt(st.nextToken());

			if (W == 0 && H == 0)
				break;

			arr = new int[H][W];
			visited = new boolean[H][W];

			for (int i = 0; i < H; i++) {
				st = new StringTokenizer(br.readLine());
				for (int j = 0; j < W; j++) {
					arr[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			int cnt = 0;
			for (int i = 0; i < H; i++) {
				for (int j = 0; j < W; j++) {
					if (arr[i][j] == 1 && !visited[i][j]) {
						cnt++;
						findIsland(i, j);
					}
				}
			}
			buf.append(cnt + "\n");
		}
		System.out.println(buf);
	}

	static void findIsland(int i, int j) {
		if (visited[i][j])
			return;
		visited[i][j] = true;
		for (int k = 0; k < 8; k++) {
			int nx = i + dx[k];
			int ny = j + dy[k];
			if (nx >= 0 && ny >= 0 && nx < H && ny < W && arr[nx][ny] == 1 && !visited[nx][ny]) {
				findIsland(nx, ny);
			}
		}
	}
}

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

2573: 빙산 (구현)  (0) 2021.02.19
3190: 뱀 (구현)  (0) 2021.02.19
2564: 경비원 (구현)  (0) 2021.02.19
8911: 거북이 (구현)  (0) 2021.02.19
11060: 점프점프 (DP) - 실패  (0) 2021.02.19