https://www.acmicpc.net/problem/4963
주변 탐색을 통해서, 독립된 섬의 개수를 세는 문제로..
DFS를 통해서 주변을 탐색하고, 연결된 탐색된 연결점을 false로 변환 함.
이렇게 반복하면서, 전체 map중 true인 점을 세면 됨.
public class BOJ4963 {
static int W, H;
static boolean[][] map;
static final int dx[] = { -1, -1, 0, 1, 1, 1, 0, -1};
static final int dy[] = { 0, 1, 1, 1, 0, -1, -1, -1};
static void dfs(int row, int cul) {
map[row][cul] = false;
for (int i = 0; i < 8 ; i++) {
int nr = row + dx[i];
int nc = cul + dy[i];
if((nr>0) && (nr<=H) && (nc>0) && (nc<=W) && map[nr][nc]) dfs(nr, nc);
}
}
public static void main(String[] args) throws IOException {
//System.setIn(new FileInputStream("res/input_boj4963.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
while (true) {
st = new StringTokenizer(br.readLine().trim(), " ");
W = Integer.parseInt(st.nextToken());
H = Integer.parseInt(st.nextToken());
map = new boolean[H+1][W+1];
if((W+H) == 0) break;
for (int i = 1; i <= H ; i++) {
st = new StringTokenizer(br.readLine().trim(), " ");
for (int j = 1; j <= W ; j++) {
String tmp = st.nextToken();
map[i][j] = (tmp.equals("1"));
}
}
long result = 0;
for (int i = 1; i <= H ; i++) {
for (int j = 1; j <= W ; j++) {
if(map[i][j]) {
result++;
dfs(i,j);
}
}
}
System.out.println(result);
}
}
}