
#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를 동작시킨다.
'Algorithm > graph' 카테고리의 다른 글
| [백준] 알고리즘 7562번 - 나이트의 이동문제 (0) | 2021.02.03 |
|---|---|
| [백준] 알고리즘 2644번 - 촌수계산 문제 (0) | 2021.01.31 |
| [백준] 알고리즘 2178번 - 미로 탐색 문제 (0) | 2021.01.28 |
| [백준] 알고리즘 7576번 - 토마토 문제 (0) | 2021.01.27 |
| [백준] 알고리즘 2667번 - 단지번호붙이기 문제 (0) | 2021.01.26 |
