본문 바로가기
알고리즘/백준

[백준/C,C++] 1012번: 유기농 배추

by 이민훈 2021. 5. 5.

www.acmicpc.net/problem/1012

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net

풀이

모든 방문하지 않은 좌표를 돌며 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

댓글