[ ALGORITHM ]/[ 백 준 ]
[BAEKJOON] 1012번 : 유기농 배추
HiStar__
2020. 8. 31. 17:10
문 제
소 스 코 드
#include <iostream>
#include <stack>
void CabbageField();
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cout.tie(NULL);
int T, N, M;
std::cin >> T;
for (int i = 0; i < T; ++i) {
CabbageField();
}
return 0;
}
void CabbageField() {
int M, N, K;
std::cin >> M >> N >> K;
bool **field{ new bool*[N] };
for (int i = 0; i < N; ++i) {
field[i] = new bool[M];
std::fill_n(field[i], M, false);
}
int X, Y;
for (int i = 0; i < K; ++i) {
std::cin >> X >> Y;
field[Y][X] = true;
}
std::stack<std::pair<int, int>> logs;
int num{ 0 };
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {
if (!field[i][j]) continue;
logs.push(std::make_pair(i, j));
field[i][j] = false;
++num;
while (!logs.empty()) {
int x = logs.top().first;
int y = logs.top().second;
logs.pop();
// [x][y] [N][M]
if ((x > 0) && (field[x - 1][y])) {
field[x - 1][y] = false;
logs.push(std::make_pair(x - 1, y));
}
if ((x < N - 1) && (field[x + 1][y])) {
field[x + 1][y] = false;
logs.push(std::make_pair(x + 1, y));
}
if ((y > 0) && (field[x][y - 1])) {
field[x][y - 1] = false;
logs.push(std::make_pair(x, y - 1));
}
if ((y < M - 1) && (field[x][y + 1])) {
field[x][y + 1] = false;
logs.push(std::make_pair(x, y + 1));
}
}
}
}
std::cout << num << '\n';
for (int i = 0; i < N; ++i) delete[] field[i];
delete[] field;
}
풀 이
더보기
[백준] 2667번 : 단지 번호 붙이기와 유사한 문제입니다
단지 번호 붙이기의 경우에는 안에 내용이 몇개 인지도 필요하지만, 이 문제의 경우에는 몇 개의 단지가 있는지만 생각하고 풀면 됩니다. DFS 깊이 기반 탐색을 통하여 구현을 하였습니다.
출 력 값
문 제 출 처
문제 링크 : www.acmicpc.net/problem/1012