import java.util.ArrayList;
import java.util.Scanner;
public class Main {
/**
* 입력
* 1]테스트케이스
* 2]가로,세로 입력 (1~50) 배추가 심어져있는 위치 개수(1~2500)
* 다음 K줄에는 배추의 위치 X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)
* dfs 가 호출되는 갯수를 세자
*
* 설계
* [1] 테스트케이스 입력
* [2] garo,sero
* [3] a[sero][garo] 선언, v[sero][garo] dx[],dy[]
* [4] k 배추 개수 17
* [5] for(0~k)
* a[x][y]=1;
*
* for(i 0~sero)
* for(j 0~garo)
* 만약 v[i][j]=f 이고 a[i][j]=1이면 dfs 탐색 시작 (v[x][y] 체크) //cnt+=1;
*
* dfs(x,y)
*
* for(i=0~4)
* cx = x + dx[i]; cy = y + dy[i];
* 만약 cx>=0 ,cy>=0 cx<sero cy<garo
* 만약 v[cx][cy]==false 이고 a[cx][cy]==1 이면 dfs(cx,cy) 호출
*/
public static int testCase;
public static int sero;
public static int garo;
public static int[][] arr;
public static boolean[][] v;
public static int k;
public static int[] dx = new int[]{0,1,0,-1};
public static int[] dy = new int[]{1,0,-1,0};
public static int cnt=0;
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
testCase = scan.nextInt();
for(int i=0;i<testCase;i++)
{
garo = scan.nextInt();sero = scan.nextInt();k=scan.nextInt();
// System.out.println("g:"+garo+" s:"+sero+" k:"+k);
arr = new int[sero][garo];
v = new boolean[sero][garo];
for(int j=1;j<=k;j++)
{
int x = scan.nextInt();int y = scan.nextInt();//4,2 a[2][4]=1;
// System.out.println("x: "+y+" y:"+x);
arr[y][x]=1;
}
for(int a=0;a<sero;a++)
{
for(int b=0;b<garo;b++)
{
if(v[a][b]==false && arr[a][b]==1)
{
cnt+=1;
v[a][b]=true;
dfs(a,b);
}
}
}
System.out.println(cnt);
cnt=0;
}
scan.close();
}
private static void dfs(int x, int y) {
for(int i=0;i<4;i++)
{
int cx = x+dx[i];int cy=y+dy[i];
if(cx>=0 && cy>=0 && cx<sero && cy<garo)
{
if(v[cx][cy]==false && arr[cx][cy]==1)
{
v[cx][cy]=true;
dfs(cx,cy);
}
}
}
}
}
알고리즘