https://www.acmicpc.net/problem/1012
DFS 연결된 컴포넌트 탐색 문제의 기초버전
그냥 1인 지역 몇구역인지 탐색하는 문제다.
상하좌우로만 뻗어나갈 수 있고 위의 arr 상황이라면 5개의 구역으로 나뉜다.
정답 코드)
#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> arr;
vector<vector<bool>> visited;
int M, N, K;
int dy[4] = { -1, 0, 1, 0 };
int dx[4] = { 0, 1, 0, -1 };
void dfs(int y, int x)
{
visited[y][x] = true; // 혹은 arr[y][x] = 0;으로 하면 공간복잡도 아낄 수 있음
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (ny < 0 || nx < 0 || ny >= N || nx >= M) continue;
if (arr[ny][nx] == 1 && !visited[ny][nx]) {
dfs(ny, nx);
}
}
}
int main()
{
ios::sync_with_stdio(false); cin.tie(NULL);
int T;
cin >> T;
while (T--) {
cin >> M >> N >> K;
arr.assign(N, vector<int>(M, 0)); // TC마다 배열 초기화
visited.assign(N, vector<bool>(M, false));
int x, y;
while (K--) {
cin >> x >> y;
arr[y][x] = 1;
}
int result = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (arr[i][j] == 1 && !visited[i][j]) {
result++;
dfs(i, j);
}
}
}
cout << result << '\n';
}
return 0;
}