입력 : 첫째 줄 - 테스트 케이스 개수 T
두번째 줄 - 배추를 심은 배추밭의 가로길이 M(1 ≤ M ≤ 50) / 세로길이 N(1 ≤ N ≤ 50) / 배추가 심어져 있는 위치의 개수 K(1 ≤ K ≤ 2500)
K줄 - 배추의 위치 X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)
출력 : 각 T에 대해 필요한 배추흰지렁이 마리 수
O(V + E)
V : 정점의 수
E : 간선의 수
DFS
import java.util.Scanner;
public class Main {
private static int[][] field;
private static boolean[][] visited;
private static int M, N;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int t = 0; t < T; t++) {
M = sc.nextInt();
N = sc.nextInt();
int K = sc.nextInt();
field = new int[M][N];
visited = new boolean[M][N];
for (int i = 0; i < K; i++) {
int x = sc.nextInt();
int y = sc.nextInt();
field[x][y] = 1;
}
int count = 0;
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (field[i][j] == 1 && !visited[i][j]) {
dfs(i, j);
count++;
}
}
}
System.out.println(count);
}
sc.close();
}
private static void dfs(int x, int y) {
int[] dx = {0, 0, -1, 1};
int[] dy = {-1, 1, 0, 0};
visited[x][y] = true;
for (int dir = 0; dir < 4; dir++) {
int nx = x + dx[dir];
int ny = y + dy[dir];
if (nx >= 0 && ny >= 0 && nx < M && ny < N) {
if (field[nx][ny] == 1 && !visited[nx][ny]) {
dfs(nx, ny);
}
}
}
}
}