풀이
모든 방문하지 않은 좌표를 돌며 DFS가 몇번 실행되는지 탐색하면 되는 문제입니다.
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int MAX = 50;
int m, n, k;
int map[MAX][MAX];
bool visited[MAX][MAX];
pair<int, int> direction[4] = { {1, 0}, {0, 1}, {-1, 0}, {0, -1} };
int res;
void DFS(int y, int x)
{
visited[y][x] = true;
for (int i = 0; i < 4; i++) {
int ny = y + direction[i].first;
int nx = x + direction[i].second;
if (ny >= 0 && nx >= 0 && ny < n && nx < m) {
if (!visited[ny][nx] && map[ny][nx]) {
DFS(ny, nx);
}
}
}
return;
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t; cin >> t;
while (t--) {
cin >> m >> n >> k;
for (int i = 0; i < k; i++) {
int x, y; cin >> x >> y;
map[y][x] = 1;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (!visited[i][j] && map[i][j]) {
DFS(i, j);
res++;
}
}
}
cout << res << '\n';
res = 0;
memset(map, 0, sizeof(map));
memset(visited, false, sizeof(visited));
}
return 0;
}
반례
Input
3
1 1 1
0 0
5 5 6
0 0
0 3
1 4
2 3
3 3
4 4
8 8 15
0 0
0 1
0 2
1 2
1 3
1 6
1 7
2 3
3 5
4 5
5 6
5 7
6 2
6 4
7 5
Output
1
5
7
'알고리즘 > 백준' 카테고리의 다른 글
[백준/C,C++] 1697번: 숨바꼭질 (0) | 2021.05.05 |
---|---|
[백준/C,C++] 7569번: 토마토 (0) | 2021.05.05 |
[백준/C,C++] 2606번: 바이러스 (0) | 2021.05.05 |
[백준/C,C++] 18870번: 좌표 압축 (0) | 2021.04.21 |
[백준/C,C++] 1655번: 가운데를 말해요 (0) | 2021.04.21 |
댓글