알고리즘 문제풀이

Q4963 섬의 개수 JAVA

JihyunLee 2019. 5. 7. 15:56
반응형
package graph;
import java.util.*;
public class Q4963 {
//섬의 갯수를 세는 문제 
	static int[] di = {-1,0,1,-1,1,-1,0,1};
	static int[] dj = {-1,-1,-1,0,0,1,1,1};
	static int arr[][];
	static int visit[][];
	static int w,h;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int cnt=0;
		Scanner scan = new Scanner(System.in);
		StringTokenizer st;
		
		while(true) {
			cnt=0;
			String s = scan.nextLine();
			st = new StringTokenizer(s," ");
			w = Integer.parseInt(st.nextToken());
			h = Integer.parseInt(st.nextToken());
			if(w==0 && h==0)	break;
			arr = new int[h][w];
			visit = new int[h][w];
			for(int i=0; i<h; i++) {
				s = scan.nextLine();
				st = new StringTokenizer(s," ");
				for(int j=0; j<w; j++) {
					arr[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			//입력완료
			for(int i=0; i<h; i++) {
				for (int j=0; j<w; j++) {
					if(arr[i][j]==1 && visit[i][j]==0) {
						find(i,j);
						cnt++;
					}
						
					
				}
			}
			System.out.println(cnt);
			
		}

	}
	public static void find(int i, int j) {
		visit[i][j] = 1;
		for(int k=0; k<8; k++) {
			int ni = i + di[k];
			int nj = j + dj[k];
			if(ni>=0 && nj>=0 && ni<h && nj<w) {
				if(arr[ni][nj]==1 && visit[ni][nj]==0) {
					find(ni,nj);
				}
			}
		}
	}

}
반응형