본문 바로가기
JAVA

백준 4963번 BFS

by Son 2023. 4. 3.

https://sonnnnnhnh.tistory.com/406

 

백준 4963번 DFS

HTML 삽입 미리보기할 수 없는 소스 https://sonnnnnhnh.tistory.com/398 [백준] 2667번 DFS https://www.acmicpc.net/problem/2667 2667번: 단지번호붙이기 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은

sonnnnnhnh.tistory.com

import java.util.*;
import java.io.*;

public class Main {
	static int arr[][];  //섬 바다를 가질 배열
	static boolean visit[][];  //BFS방문여부
	static int dirX[] = {0, 0, -1 ,1, -1, 1, -1, 1}; // 상 하 좌 우 대각선 상좌, 상우, 하좌, 하우
	static int dirY[] = {-1, 1, 0, 0, 1, 1, -1, -1}; // 상 하 좌 우 대각선 상좌, 상우, 하좌, 하우

	static int w, h, nowX, nowY;  //넓이 높이 인접 섬의 넓이 높이 

	static class Node {   //q노드
		int x;
		int y;

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

	public static void main(String[] args) throws Exception {
		StringBuilder sb = new StringBuilder();  //섬의 개수를 담는 StringBuilder 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
		StringTokenizer st;

		String str = " ";
		while( !(str = br.readLine()).equals("0 0") ) {  //테스트케이스 넓이가 00이면 안되므로 
			st = new StringTokenizer(str);


			w = Integer.parseInt(st.nextToken()); // 너비
			h = Integer.parseInt(st.nextToken()); // 높이
			arr = new int[h][w];
			visit = new boolean[h][w];

			for(int i=0; i<h; i++) {  //섬과 바다를 arr배열에 담는다
				st = new StringTokenizer(br.readLine());

				for(int j=0; j<w; j++) {
					arr[i][j] = Integer.parseInt(st.nextToken());

				}
			}

			int island_count = 0;  //섬개수 초기화
			for(int i=0; i<h; i++) {
				for(int j=0; j<w; j++) {
					
					if(!visit[i][j] && arr[i][j] == 1) {  //아직 방문하지 않고 1=섬이라면
						BFS(i, j);  
						island_count++;
					}
				}
			} 

			sb.append(island_count).append('\n');  //섬개수 출력후 줄바꿈
		}

		System.out.println(sb);
	} // End of main
	
	static void BFS(int x, int y) {
		Queue<Node> que = new LinkedList<Node>();  //node class를 담는 que
		visit[x][y] = true;  //방문
		que.offer(new Node(x, y));  //현재 섬의 좌표를 node class에 생성자에 넣고 que에 넣어줌
		
		while( !que.isEmpty() ) {
			Node node = que.poll();
		
			for(int i=0; i<8; i++) {
				nowX = dirX[i] + node.x;  //상하좌우대각선
				nowY = dirY[i] + node.y;

				if(range_check() && !visit[nowX][nowY] && arr[nowX][nowY] == 1) {  //인접 행렬을 방문하지 않았고 인접행렬이 섬인경우
					visit[nowX][nowY] = true;  //방문
					que.offer(new Node(nowX, nowY)); //다시 BFS
				}
			}
		}

	} // End of BFS;

	static boolean range_check() {
		return (nowX >= 0 && nowY >= 0 && nowX < h && nowY < w);  //배열 index 시작 0 끝 h w
	} // End of range_check
	
} // End of Main class

1.BFS이므로 que를 사용할것 

2.node class를 생성하여 매게변수로 섬의 좌표값을 넣고 그것을 que에 offer 하였음

 

'JAVA' 카테고리의 다른 글

[백준 2178] 미로 탐색(Java) BFS  (0) 2023.04.19
백준 2178  (0) 2023.04.07
백준 4963번 DFS  (0) 2023.03.29
[백준] 2667번 BFS  (2) 2023.03.25
[백준] 2667번 DFS  (0) 2023.03.12