[알고리즘] 1012번: 유기농 배추
2023. 8. 31. 04:44ㆍAlgorithm/with C++
0. 문제
1. 문제 이해
주어진 맵에서 덩어리의 개수를 알아내면 된다.
이런 덩어리를 연결된 컴포넌트(connected component)라고 한다.
- 연결된 노드를 탐색한다. 그리고 배제한다. → DFS, BFS 사용.
https://ko.wikipedia.org/wiki/플러드_필
2. 제출
가. a[][], visited[][]를 전역 변수로 선언
//백준 1012: 유기농 배추
#include <iostream>
#include <cstring> // memeset
using namespace std;
const int max_n = 50;
const int max_m = 50;
const int dy[] ={-1, 0, 1, 0};
const int dx[] ={0, 1, 0, -1};
int a[max_n][max_m], visited[max_n][max_m];
int t, n, m, k;
void dfs(int y, int x){
visited[y][x] = 1;
for(int i=0; i<4; i++){
int ny = y + dy[i];
int nx = x + dx[i];
bool underflow = ny < 0 || nx < 0;
bool overflow = ny >= n || nx >= m;
if(underflow || overflow) continue;
if(a[ny][nx]==1 && !visited[ny][nx]){
dfs(ny, nx);
}
}
return;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> t;
for(int test_case = 1; test_case <= t; test_case++){
int ret = 0;
memset(a, 0, sizeof(a));
memset(visited, 0, sizeof(visited));
cin >> m >> n >> k;
for(int i=0; i<k; i++){
int x, y;
cin >> x >> y;
a[y][x]=1;
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(a[i][j]==1 && !visited[i][j]){
ret++;
dfs(i,j);
}
}
}
cout << ret << "\n";
}
return 0;
}
memset(a, 0, sizeof(a)); memset(visited, 0, sizeof(visited));
: 이차원a
와visited
를0
으로 배열 초기화.
나. a[][], visited[][]를 지역 변수로 선언
//백준 1012: 유기농 배추
#include <iostream>
using namespace std;
const int max_n = 50;
const int max_m = 50;
const int dy[] ={-1, 0, 1, 0};
const int dx[] ={0, 1, 0, -1};
int t, n, m, k;
void dfs(int y, int x, int a[][max_m], int visited[][max_m]){
visited[y][x] = 1;
for(int i=0; i<4; i++){
int ny = y + dy[i];
int nx = x + dx[i];
bool underflow = ny < 0 || nx < 0;
bool overflow = ny >= n || nx >= m;
if(underflow || overflow) continue;
if(a[ny][nx]==1 && !visited[ny][nx]){
dfs(ny, nx, a, visited);
}
}
return;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> t;
for(int test_case = 1; test_case <= t; test_case++){
int ret = 0;
int a[max_n][max_m], visited[max_n][max_m];
fill(&a[0][0], &a[0][0] + max_n * max_m, 0);
fill(&visited[0][0], &visited[0][0] + max_n * max_m, 0);
cin >> m >> n >> k;
for(int i=0; i<k; i++){
int x, y;
cin >> x >> y;
a[y][x]=1;
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(a[i][j]==1 && !visited[i][j]){
ret++;
dfs(i,j,a,visited);
}
}
}
cout << ret << "\n";
}
return 0;
}
void dfs(int y, int x, int a[][max_m], int visited[][max_m]){
또는void dfs(int y, int x, int a[max_n][max_m], int visited[max_n][max_m]){
로 이차원 배열을 매개변수로 선언.
'Algorithm > with C++' 카테고리의 다른 글
[알고리즘] 2583번: 영역 구하기 (0) | 2023.09.01 |
---|---|
[알고리즘] 2468번: 안전 영역 (0) | 2023.09.01 |
[알고리즘] 2178번: 미로 탐색 (+ 붙어있는 입력) (0) | 2023.08.30 |
[알고리즘] 그래프 이론 기초 (0) | 2023.08.29 |
[알고리즘] 1859. 백만 장자 프로젝트 (0) | 2023.08.24 |