백준 1012 : 유기농 배추
문제 링크
문제 내용
(요약) 고르지 못한 배추밭에 해충 방지에 효과적인 배추흰지렁이를 구입하고자 한다. 이 지렁이는 배추 근처에 서식하며 해충을 잡아먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다.(상하좌우에 배추가 위치한 경우 인접해있다고 간주한다.)
이때, 배추밭에 필요한 최소 배추흰지렁이 마리 수를 구하라.
Idea
깊이우선탐색(dfs)를 사용하여 배추가 서로 인접해있는지 확인하였다.
알고리즘은 아래와 같다.
- 해당 좌표가 '1'이라면 dfs를 호출하여 인접한 배추를 탐색한다.
- 상하좌우를 탐색하며 방문한 곳은 '0'으로 바꿔준다.
- 상하좌우가 모두 '0'이라면 dfs를 탈출한다.
- 모든 좌표가 '0'이 될 때까지 1~3을 반복한다.
이 dfs는 한번 탐색을 시작하면 인접한 배추들을 모두 탐색하고 이 재귀함수를 탈출한다.
따라서, 최소 배추흰지렁이 수는 처음 dfs를 호출하는 수와 같다.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#include <stdio.h>
#include <string.h>
int field[50][50], m, n;
int dfs(int x, int y) {
//방문한 곳은 0으로 바꾸기
field[x][y] = 0;
//상하좌우로 탐색
if (x + 1 < m && field[x + 1][y] == 1) dfs(x + 1, y);
if (x - 1 >= 0 && field[x - 1][y] == 1) dfs(x - 1, y);
if (y + 1 < n && field[x][y + 1] == 1) dfs(x, y + 1);
if (y - 1 >= 0 && field[x][y - 1] == 1) dfs(x, y - 1);
return 0;
}
int main() {
int T;
scanf("%d", &T);
int k, x, y, cnt;
for (int test_case = 0; test_case < T; test_case++) {
//배열 초기화
memset(field, 0, sizeof(field));
scanf("%d %d %d", &m, &n, &k);
//배추위치
while (k--) {
scanf("%d %d", &x, &y);
field[x][y] = 1;
}
//필요한 지렁이 수 구하기
cnt = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
//배추가 있는 곳만 dfs 실행
if (field[i][j] == 1) {
dfs(i, j);
cnt++;
}
}
}
//결과 출력
printf("%d\n", cnt);
}
return 0;
}
|
cs |
'백준 Baekjoon' 카테고리의 다른 글
[C언어] 백준 3040 : 백설 공주와 일곱 난쟁이 (0) | 2021.02.03 |
---|---|
[C언어] 백준 1074 : Z (0) | 2021.01.25 |
[C++] 백준 1966 : 프린터 큐 (0) | 2021.01.07 |
[C++] 백준 2293 : 동전 1 (0) | 2020.12.22 |
[C++] 백준 11399 : ATM (0) | 2020.12.14 |