dfs로 인접한 섬을 계산하는 간단한 문제입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int[] x = {1, 1, 1, 0, 0, -1, -1, -1};
public static int[] y = {1, -1, 0, 1, -1, 1, -1, 0};
public static int[][] map;
public static boolean[][] visited;
public static int N = Integer.MAX_VALUE;
public static int M = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
while(true){
st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
if(M == 0 && N == 0) break;
map = new int[N][M];
visited = new boolean[N][M];
for(int i = 0; i < N; i++){
st = new StringTokenizer(br.readLine());
for(int j = 0; j < M; j++){
int tmp = Integer.parseInt(st.nextToken());
map[i][j] = tmp;
visited[i][j] = false;
}
}
int cnt = 0;
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
if(map[i][j] == 1 && !visited[i][j]){
dfs(i, j);
cnt++;
}
}
}
System.out.println(cnt);
}
}
private static void dfs(int n, int m) {
visited[n][m] = true;
for(int i = 0; i < 8; i++){
int tmpX = x[i] + n;
int tmpY =y[i] + m;
if(tmpX >= 0 && tmpX < N && tmpY >= 0 && tmpY < M){
if(map[tmpX][tmpY] > 0 && !visited[tmpX][tmpY]) dfs(tmpX, tmpY);
}
}
}
}