Algorithm/graph
[백준] 알고리즘 4963번 - 섬의 개수 문제
낭강
2021. 1. 29. 21:12
#include <bits/stdc++.h>
using namespace std;
int dx[8] = {-1,-1,0,1,1,1,0,-1};
int dy[8] = {0,1,1,1,0,-1,-1,-1};
int arr[51][51];
bool check[51][51];
int w, h;
void dfs(int x,int y) {
check[x][y] = true;
for (int i = 0; i < 8; i++) {
int nx = dx[i] + x;
int ny = dy[i] + y;
if (nx<0 || nx>h - 1 || ny<0 || ny>w - 1) continue;
if (arr[nx][ny] == 1&&check[nx][ny]==false) {
check[nx][ny] = true;
dfs(nx,ny);
}
}
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
while (1) {
int ans = 0;
cin >> w >> h;
if (w == 0 && h == 0) break;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
cin >> arr[i][j];
}
}
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (arr[i][j]==1&&check[i][j]==false) {
dfs(i, j);
ans += 1;
}
}
}
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
arr[i][j] = 0;
check[i][j] = false;
}
}
cout << ans << "\n";
}
}
DFS를 이용하여 문제를 해결하였습니다.
우선 입력 받는 부분을 이해해야한다.
테스트케이스가 주어지지 않았기 때문에, 계속 반복하면서 반복 종료조건인 0 0 이 입력되면 반복문을 탈출해야 한다.
그리고 하나의 테스트 케이스가 끝나게 되면 기존 배열과 체크 배열을 초기화 시켜줘야 한다.
dfs를 돌리는 조건문은 - arr에 입력값이 1 이고 체크 배열의 방문이 되지 않은 상태일때 dfs를 동작시킨다.