아마도 가장 전형적인 DFS 문제가 아닐까 싶다.
한 지점에 지렁이가 있으면 그와 이웃한 곳에는 지렁이가 없어도 된다 (대각선 제외) .
모든 땅을 전부 돌면서 배추가 없는 곳과 방문을 했던 곳은 볼 필요 없고
배추가 있으면서 동시에 방문 하지 않았던 곳에서 출력값을 ++ 해준다.
그리고 DFS 함수를 이용해 그와 이웃한 곳에 있는 땅을 전부 방문해서 그곳에 배추가 있으면 방문기록을 해준다.
#include <iostream>
using namespace std;
int farm[50][50];
int visited[50][50];
int m, n, k;
void DFS(int a, int b) {
if (farm[a + 1][b] && a + 1 < m && !visited[a + 1][b]) {
visited[a + 1][b] = 1;
DFS(a + 1, b);
}
if (farm[a - 1][b] && a - 1 >= 0 && !visited[a - 1][b]) {
visited[a - 1][b] = 1;
DFS(a - 1, b);
}
if (farm[a][b + 1] && b + 1 < n && !visited[a][b + 1]) {
visited[a][b + 1] = 1;
DFS(a, b + 1);
}
if (farm[a][b - 1] && b - 1 >= 0 && !visited[a][b - 1]) {
visited[a][b - 1] = 1;
DFS(a, b - 1);
}
}
int main() {
int t; cin >> t;
int x, y;
while (t--) {
for (int i = 0; i < 50; i++) {
for (int j = 0; j < 50; j++) {
farm[i][j] = 0;
visited[i][j] = 0;
}
}
cin >> m >> n >> k;
for (int i = 0; i < k; i++) {
cin >> x >> y;
farm[x][y] = 1;
}
int result = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (farm[i][j] && !visited[i][j]) {
result++;
visited[i][j] = 1;
DFS(i, j);
}
}
}
cout << result << "\n";
}
}
'백준' 카테고리의 다른 글
[프로그래머스] 개인정보 수집 유효기간 C++ (0) | 2024.03.28 |
---|---|
[C++] 백준 1107 (리모컨) (0) | 2023.08.08 |
[C++] 1331번 (나이트 투어) (0) | 2023.05.07 |
[C] 백준 1003번 (피보나치 함수) (0) | 2023.04.11 |
[C] 백준 2579번 (계단 오르기) (0) | 2023.04.10 |
댓글