문제
https://www.acmicpc.net/problem/1012
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
소스코드
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int arr[51][51];
int check[51][51];
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
queue<pair<int,int>> qu;
int n, m, k;
void bfs(int x, int y) {
qu.push({ x,y });
check[x][y] = true;
while (!qu.empty()) {
int ox = qu.front().first;
int oy = qu.front().second;
qu.pop();
for (int i = 0; i < 4; i++) {
int nx = ox + dx[i];
int ny = oy + dy[i];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (arr[nx][ny] == 1&&!check[nx][ny]) {
qu.push({ nx,ny });
check[nx][ny] = true;
}
}
}
}
int main() {
ios_base::sync_with_stdio(false), cin.tie(NULL);
int T;
cin >> T;
while (T--) {
cin >> m >> n >> k;
int ans = 0;
for (int i = 0; i < k; i++) {
int x, y;
cin >> x >> y;
arr[y][x] = 1;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (arr[i][j] == 1&&!check[i][j]) {
bfs(i, j);
ans++;
}
}
}
cout << ans << "\n";
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
arr[i][j] = 0;
check[i][j] = false;
}
}
}
}
해설
문제는 간단합니다.
배추가 있는 곳에 흰 지렁이를 심어서 배추를 해충으로부터 보호하고 싶어합니다.
결국 모든 경우의 수를 다돌면서 배추가 있는 부분을 개수를 세달라는 문제입니다.
하지만 인접한 배추의 경우는 배추흰지렁이1마리로 충분하다고 합니다.
최소한, 인접 = BFS를 먼저 떠올려서 문제를 해결해보았습니다.
하나의 배추를 가진 좌표에서 인접한 부분을 탐색해주면 되는 문제입니다.
테스트케이스를 통해 입력받아 여러가지 입력을 받으므로 하나의 테스트가 끝난 후에는 배열과 체크배열을 초기화시켜주는 것을 잊지말아야 합니다.!
'Algorithm > bfs' 카테고리의 다른 글
| [백준] 알고리즘 C++ 2206번 - 벽 부수고 이동하기문제 (0) | 2022.02.02 |
|---|---|
| [백준] 알고리즘 1261번 - 알고스팟문제 (0) | 2021.08.24 |
| [백준] 알고리즘 13549번 - 숨바꼭질 3문제 (0) | 2021.08.24 |
| [백준] 알고리즘 14226번 - 이모티콘문제 (0) | 2021.08.24 |
| [백준] 알고리즘 13913번 - 숨바꼭질4문제 (0) | 2021.08.19 |
