4963번: 섬의 개수
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도�
www.acmicpc.net
- DFS 를 통해 간단하게 풀 수 있는 문제이다.
- w 가 열의 갯수, h 가 행의 갯수인데 이를 반대로 써서 헷갈렸을 뿐..
#include <iostream>
using namespace std;
int w, h;
int map[50][50];
int dir[3] = {-1, 0, 1};
void dfs(int row, int col) // dfs 로 섬 하나씩 처리
{
if(0 <= row && row < w && 0 <= col && col < h)
if(map[row][col] == 1)
{
map[row][col] = 0;
for(int r = 0 ; r < 3 ; r++) // 가로, 세로, 대각선으로 이어진 땅들 하나로 묶음
for(int c = 0 ; c < 3 ; c++)
dfs(row + dir[r], col + dir[c]);
}
}
int main()
{
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
while (true)
{
cin >> h >> w;
if(w == 0 && h == 0) break;
int answer = 0;
for(int r = 0 ; r < w ; r++)
for(int c = 0 ; c < h ; c++)
cin >> map[r][c];
for(int r = 0 ; r < w ; r++)
for(int c = 0 ; c < h ; c++) // 아직 방문하지 않은 땅이 있다면
if(map[r][c] == 1) // 해당 땅에 속하는 섬을 하나로 묶어서 셈
{
answer++;
dfs(r, c);
}
cout << answer << '\n';
}
}
'PS > BOJ' 카테고리의 다른 글
[백준] 9934 : 완전 이진 트리 (0) | 2020.09.16 |
---|---|
[백준] 2468 : 안전 영역 (0) | 2020.09.15 |
[백준] 19844 : 단어 개수 세기 (0) | 2020.09.13 |
[백준] 2156.cpp : 포도주 시식 (0) | 2020.09.11 |
[백준] 1904.cpp : 01타일 (0) | 2020.09.09 |