728x90
import java.io.*;
import java.util.*;
import java.math.*;
public class Main {
static int count = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
for(int ii = 0 ; ii < n ; ii++)
{
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int[][] map = new int[x][y];
boolean[][] visited = new boolean[x][y];
int k = Integer.parseInt(st.nextToken());
for(int jj = 0 ; jj < k ; jj++)
{
st = new StringTokenizer(br.readLine());
map[Integer.parseInt(st.nextToken())][Integer.parseInt(st.nextToken())] = 1;
}
int answer = 0;
for(int xx = 0 ; xx < x ; xx++)
for(int yy = 0 ; yy < y ; yy++)
answer += dfs(map, visited, x, y, xx, yy, answer);
System.out.println(answer);
}
br.close();
}
public static int dfs(int[][] map, boolean[][] visited, int X, int Y, int xx, int yy, int answer) {
if (visited[xx][yy] == false && map[xx][yy] == 1) {
visited[xx][yy] = true;
/* 처음엔 up right left down을 if else if로 묶었는데 많은 테스트케이스를 통과해도 틀렸다고 나왔었다. 그래서 따로 분리했더니 정답 */
if (up(map, visited, X, Y, xx, yy) == true) {
// visited[xx-1][yy] = true;
dfs(map, visited, X, Y, xx - 1, yy, answer);
}
if (right(map, visited, X, Y, xx, yy) == true) {
// visited[xx][yy+1] = true;
dfs(map, visited, X, Y, xx, yy + 1, answer);
}
if (down(map, visited, X, Y, xx, yy) == true) {
// visited[xx+1][yy] = true;
dfs(map, visited, X, Y, xx + 1, yy, answer);
}
if (left(map, visited, X, Y, xx, yy) == true) {
// visited[xx][yy-1] = true;
dfs(map, visited, X, Y, xx, yy - 1, answer);
}
if (up(map, visited, X, Y, xx, yy) == false && right(map, visited, X, Y, xx, yy) == false
&& left(map, visited, X, Y, xx, yy) == false && down(map, visited, X, Y, xx, yy) == false)
return 1;
else
return 0;
}
else
return 0;
}
public static boolean up(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
{
if(x-1 >= 0 && map[x -1][y] == 1 && visited[x-1][y] == false)
return true;
else
return false;
}
public static boolean right(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
{
if(y+1 < Y && map[x][y+1] == 1 && visited[x][y+1] == false)
return true;
else
return false;
}
public static boolean down(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
{
if(x+1 < X && map[x+1][y] == 1 && visited[x+1][y] == false)
return true;
else
return false;
}
public static boolean left(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
{
if(y-1 >= 0 && map[x][y-1] == 1 && visited[x][y-1] == false)
return true;
else
return false;
}
}
728x90
'코딩 테스트' 카테고리의 다른 글
1158번 요세푸스 문제(자바, java) - 백준 문제풀이 (0) | 2023.01.11 |
---|---|
6603번 로또 문제(자바, java) - 백준 문제풀이 (0) | 2023.01.11 |
7576번 토마토 문제(자바, java) - 백준 문제풀이 (0) | 2023.01.09 |
11728번 배열 합치기 문제(자바, java) - 백준 문제풀이 (0) | 2023.01.09 |
2217번 로프(자바, java) - 백준 문제풀이 (0) | 2023.01.09 |