https://www.acmicpc.net/problem/1012
전형적인 dfs 혹은 bfs 로 풀수있는 문제이다.딱히 풀이방법을 적을 것도 없이 인접한 배추끼리는 에벌레 1마리로 벌레를 예방가능하므로인접한 배추들끼리 그룹을 지어 최소로 필요한 에벌레의 갯수를 구할 수 있다.#include <iostream>#define MAX 50using namespace std;int m, n;int dx[4] = {0, -1, 0, 1};int dy[4] = {-1, 0, 1, 0};bool isInner(int x, int y) {return (x >= 0 && x < n && y >= 0 && y < m);}// 4방향 탐색하면서 인접한 배추들의 그룹을 만듬void makeGroup(int (*map)[MAX + 1], int (*group)[MAX + 1], int x, int y, int gNum) {for (int i = 0; i < 4; ++i) {int nx = x + dx[i];int ny = y + dy[i];if (isInner(nx, ny) && map[nx][ny] == 1 && group[nx][ny] == 0) {group[nx][ny] = gNum;makeGroup(map, group, nx, ny, gNum);}}}int main(){int T, k, x, y;scanf("%d", &T);for (int i = 0; i < T; ++i) {int gNum = 1;int map[MAX + 1][MAX + 1] = {0, };int group[MAX + 1][MAX + 1] = {0, };// 배추 표시scanf("%d %d %d", &m, &n, &k);for (int j = 0; j < k; ++j) {scanf("%d %d", &y, &x);map[x][y] = 1;}for (int row = 0; row < n; ++row) {for (int col = 0; col < m; ++col) {// 배추 && 그룹 미지정일 때만 그룹만들기 수행if (map[row][col] == 1 && group[row][col] == 0) {makeGroup(map, group, row, col, gNum);gNum++;}}}// 그룹의 갯수 - 1 이 최소 애벌레의 갯수printf("%d\n", gNum - 1);}return 0;}
'알고리즘 풀이' 카테고리의 다른 글
백준 11053번 가장 긴 증가하는 부분 수열 (0) | 2018.06.25 |
---|---|
프로그래머스 124 나라의 숫자 (0) | 2018.06.15 |
백준 9465번 스티커 (0) | 2018.06.14 |
백준 7562번 나이트의 이동 (0) | 2018.06.13 |
백준 2644번 촌수 (0) | 2018.06.12 |