https://www.acmicpc.net/problem/1012
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
우선 문제부터 간단하게 요약하면,
배추를 재배하는 땅에 배추영역이 총 몇개 존재하는 지를 출력해야 하는 문제입니다.
<Solution>
가장 흔한 유형의 flood fill 유형의 문제이므로 bfs 알고리즘을 접목하여 문제를 해결하면 됩니다.
실제 구현은 아래와 같습니다.
#include <iostream>
#include <queue>
using namespace std;
int T, M, N, K;
int grid[50][50]; // 0~49
int c, r;
int dirR[4] = {0, 0, 1, -1};
int dirC[4] = {1, -1, 0, 0};
struct rc{
int r, c;
};
int main(){
cin >> T;
for(int i = 0; i < T; i++){
int cnt = 0;
// initialize grid
for(int j = 0; j<50; j++){
for(int k = 0; k<50; k++){
grid[j][k] = 0;
}
}
cin >> M >> N >> K; // c, r, num
for(int j = 0; j < K; j++){
// x, y => c, r 상대좌표라 상관 x
cin >> c >> r;
grid[r][c] = 1;
}
// flood fill
for(int j = 0; j < N; j++){
for(int k = 0; k < M; k++){
if(grid[j][k] == 0) continue; // visited or empty
// bfs
queue<rc> q;
q.push({j,k});
grid[j][k] = 0;
cnt ++;
while(!q.empty()){
rc curRC = q.front(); q.pop();
int curR = curRC.r;
int curC = curRC.c;
int nextR, nextC;
for(int l = 0; l<4; l++){
nextR = curR + dirR[l];
nextC = curC + dirC[l];
// if oob
if(!(0 <= nextR && nextR < N) || !(0 <= nextC && nextC < M)) continue;
if(grid[nextR][nextC] == 0) continue;
grid[nextR][nextC] = 0;
q.push({nextR, nextC});
}
}
}
}
cout << cnt << '\n';
}
}
반응형
'코딩테스트 > C++ 문제풀이' 카테고리의 다른 글
[백준] Four Squares (1) | 2023.05.29 |
---|---|
[백준] 팩토리얼 0의 개수 (1) | 2023.05.29 |
[백준] 에너지 모으기 (1) | 2023.05.07 |
[백준] 두 동전 (0) | 2023.05.07 |
[백준] 부분수열의 합 (0) | 2023.04.14 |