import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static public int[][] map; // [y][x] 가 됨.
static public boolean[][] visited; //마찬가지로 [y][x]
static public LinkedList<ArrayList<Integer>> points;
static public int count =0;
static public int[] gx = {1,-1,0,0};
static public int[] gy = {0,0,-1,1};
static public int map_x_size=0;
static public int map_y_size=0;
int test_case
= Integer.
parseInt(bufferedReader.
readLine()); LinkedList<Integer> answer = new LinkedList<>();
while (test_case!=0) {
String[] t
= bufferedReader.
readLine().
split(" ");
count=0;
map_x_size
= Integer.
parseInt(t
[0]); map_y_size
= Integer.
parseInt(t
[1]);
map = new int[map_y_size+1][map_x_size+1];
visited = new boolean[map_y_size+1][map_x_size+1];
points = new LinkedList<>();
for (int i = 0; i < K; i++) {
String[] s
= bufferedReader.
readLine().
split(" ");
map[b][a] = 1;
ArrayList<Integer> p = new ArrayList<>();
p.add(b);
p.add(a); //points 안에 배추의 위치가 { {y1,x1}, {y2,x2}, ... }이렇게 저장됨
points.add(p);
}
while (points.size() != 0) { //만약 배추가 아예 없는 밭에서는 그냥 while문 실행 없이 초기에 빠져나감 -> 에러 없음
ArrayList<Integer> xy = points.get(0);
int x = xy.get(1);
int y = xy.get(0);
DFS(y, x);
count++;
}
test_case--;
answer.add(count);
}
for (int i: answer)
}
static public void DFS(int y,int x){
remove_from_points(y,x);
visited[y][x] = true;
for (int i =0; i<4; i++){
int next_y = y+gy[i];
int next_x = x+gx[i];
if(next_x<0 || next_y<0 || next_y>map_y_size-1 || next_x>map_x_size-1 ) continue;
if(map[next_y][next_x]==1){
if(visited[next_y][next_x]==false){
DFS(next_y,next_x);
}
}
}
}
static public void remove_from_points(int y, int x){
ArrayList<Integer> xy = new ArrayList<>();
xy.add(y); xy.add(x);
int ct = 0;
for (Iterator<ArrayList<Integer>> iterator = points.iterator(); iterator.hasNext();){
ArrayList<Integer> al = iterator.next();
if(al.containsAll(xy)){
iterator.remove();
break;
}
}
}
}
aW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKaW1wb3J0IGphdmEudXRpbC4qOwoKcHVibGljIGNsYXNzIE1haW4gewogICAgc3RhdGljIHB1YmxpYyBpbnRbXVtdIG1hcDsgLy8gW3ldW3hdIOqwgCDrkKguCiAgICBzdGF0aWMgcHVibGljIGJvb2xlYW5bXVtdIHZpc2l0ZWQ7IC8v66eI7LCs6rCA7KeA66GcIFt5XVt4XQogICAgc3RhdGljIHB1YmxpYyBMaW5rZWRMaXN0PEFycmF5TGlzdDxJbnRlZ2VyPj4gcG9pbnRzOwogICAgc3RhdGljIHB1YmxpYyBpbnQgY291bnQgPTA7CgogICAgc3RhdGljIHB1YmxpYyBpbnRbXSBneCA9IHsxLC0xLDAsMH07CiAgICBzdGF0aWMgcHVibGljIGludFtdIGd5ID0gezAsMCwtMSwxfTsKICAgIHN0YXRpYyBwdWJsaWMgaW50ICBtYXBfeF9zaXplPTA7CiAgICBzdGF0aWMgcHVibGljIGludCAgbWFwX3lfc2l6ZT0wOwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnVmZmVyZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOwoKICAgICAgICBpbnQgdGVzdF9jYXNlID0gSW50ZWdlci5wYXJzZUludChidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpKTsKICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGFuc3dlciA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKCiAgICAgICAgd2hpbGUgKHRlc3RfY2FzZSE9MCkgewogICAgICAgICAgICBTdHJpbmdbXSB0ID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKS5zcGxpdCgiICIpOwoKICAgICAgICAgICAgY291bnQ9MDsKICAgICAgICAgICAgbWFwX3hfc2l6ZSA9IEludGVnZXIucGFyc2VJbnQodFswXSk7CiAgICAgICAgICAgIG1hcF95X3NpemUgPSBJbnRlZ2VyLnBhcnNlSW50KHRbMV0pOwogICAgICAgICAgICBpbnQgSyA9IEludGVnZXIucGFyc2VJbnQodFsyXSk7CgogICAgICAgICAgICBtYXAgPSBuZXcgaW50W21hcF95X3NpemUrMV1bbWFwX3hfc2l6ZSsxXTsKICAgICAgICAgICAgdmlzaXRlZCA9IG5ldyBib29sZWFuW21hcF95X3NpemUrMV1bbWFwX3hfc2l6ZSsxXTsKICAgICAgICAgICAgcG9pbnRzID0gbmV3IExpbmtlZExpc3Q8PigpOwoKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBLOyBpKyspIHsKICAgICAgICAgICAgICAgIFN0cmluZ1tdIHMgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpLnNwbGl0KCIgIik7CiAgICAgICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQoc1swXSk7CiAgICAgICAgICAgICAgICBpbnQgYiA9IEludGVnZXIucGFyc2VJbnQoc1sxXSk7CgogICAgICAgICAgICAgICAgbWFwW2JdW2FdID0gMTsKCiAgICAgICAgICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gcCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICAgICAgcC5hZGQoYik7CiAgICAgICAgICAgICAgICBwLmFkZChhKTsgLy9wb2ludHMg7JWI7JeQIOuwsOy2lOydmCDsnITsuZjqsIAgeyB7eTEseDF9LCB7eTIseDJ9LCAuLi4gIH3snbTroIfqsowg7KCA7J6l65CoCgogICAgICAgICAgICAgICAgcG9pbnRzLmFkZChwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKHBvaW50cy5zaXplKCkgIT0gMCkgeyAvL+unjOyVvSDrsLDstpTqsIAg7JWE7JiIIOyXhuuKlCDrsK3sl5DshJzripQg6re464OlIHdoaWxl66y4IOyLpO2WiSDsl4bsnbQg7LSI6riw7JeQIOu5oOyguOuCmOqwkCAtPiDsl5Drn6wg7JeG7J2MCiAgICAgICAgICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4geHkgPSBwb2ludHMuZ2V0KDApOwoKICAgICAgICAgICAgICAgIGludCB4ID0geHkuZ2V0KDEpOwogICAgICAgICAgICAgICAgaW50IHkgPSB4eS5nZXQoMCk7CgogICAgICAgICAgICAgICAgREZTKHksIHgpOwoKICAgICAgICAgICAgICAgIGNvdW50Kys7CgogICAgICAgICAgICB9CgogICAgICAgICAgICB0ZXN0X2Nhc2UtLTsKICAgICAgICAgICAgYW5zd2VyLmFkZChjb3VudCk7CiAgICAgICAgfQogICAgICAgIGZvciAoaW50IGk6IGFuc3dlcikKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGkpOwogICAgfQoKICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBERlMoaW50IHksaW50IHgpewogICAgICAgIHJlbW92ZV9mcm9tX3BvaW50cyh5LHgpOwoKICAgICAgICB2aXNpdGVkW3ldW3hdID0gdHJ1ZTsKCiAgICAgICAgZm9yIChpbnQgaSA9MDsgaTw0OyBpKyspewogICAgICAgICAgICBpbnQgbmV4dF95ID0geStneVtpXTsKICAgICAgICAgICAgaW50IG5leHRfeCA9IHgrZ3hbaV07CiAgICAgICAgICAgIGlmKG5leHRfeDwwIHx8IG5leHRfeTwwIHx8IG5leHRfeT5tYXBfeV9zaXplLTEgfHwgbmV4dF94Pm1hcF94X3NpemUtMSApIGNvbnRpbnVlOwogICAgICAgICAgICBpZihtYXBbbmV4dF95XVtuZXh0X3hdPT0xKXsKICAgICAgICAgICAgICAgIGlmKHZpc2l0ZWRbbmV4dF95XVtuZXh0X3hdPT1mYWxzZSl7CiAgICAgICAgICAgICAgICAgICAgREZTKG5leHRfeSxuZXh0X3gpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyBwdWJsaWMgdm9pZCByZW1vdmVfZnJvbV9wb2ludHMoaW50IHksIGludCB4KXsKICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4geHkgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICB4eS5hZGQoeSk7IHh5LmFkZCh4KTsgCiAgICAgICAgaW50ICBjdCA9IDA7IAoKICAgICAgICBmb3IgKEl0ZXJhdG9yPEFycmF5TGlzdDxJbnRlZ2VyPj4gaXRlcmF0b3IgPSBwb2ludHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7CiAgICAgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBhbCA9IGl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgaWYoYWwuY29udGFpbnNBbGwoeHkpKXsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOyAKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9