-
[BFS] BOJ 4963 : 섬의 개수백준 문제풀이/GRAPH 2019. 8. 15. 19:06
백준 알고리즘 강의를 토대로 작성된 문제풀이입니다.
DFS 와 BFS 의 개념에 대해서는 지난 포스트를 봐주세요.
DFS : 2019/05/23 - [프로그래밍/알고리즘] - [알고리즘] 깊이 우선 탐색(DFS, Depth-First Search)
BFS : 2019/05/26 - [프로그래밍/알고리즘] - [알고리즘] 너비 우선 탐색(BFS, Breadth-First Search)
예제 : 2019/07/22 - [프로그래밍/1일1백준] - [Graph] BOJ 1260 : DFS 와 BFS문제
정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오.
한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다.
두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다.
둘째 줄부터 h개 줄에는 지도가 주어진다. 1은 땅, 0은 바다이다.
입력의 마지막 줄에는 0이 두 개 주어진다.
출력
각 테스트 케이스에 대해서, 섬의 개수를 출력한다.
풀이
직전 문제와 아주 유사합니다.
2019/08/14 - [프로그래밍/1일1백준] - [BFS] BOJ 2667 : 단지번호붙이기
이번에도 역시 이전 문제와의 차이점만 체크하겠습니다.
1. 대각선 이동이 가능하다.
2. 각 연결 요소 안의 정점의 수는 확인할 필요가 없다.
저번 문제에서 어떤 것을 바꿔야 하는지 파악이 되시나요?
첫 번째로 이동을 위해 선언되었던 dx 와 dy 의 인수를
대각선까지 포함해서 변경해줍니다.
그리고 정점의 수를 출력하지 않고 오직 컴포넌트의 개수만
출력하도록 cout 파트를 변경해줍니다.
이번 문제는 이전 문제의 복습 정도로 풀어봤습니다.
코드
#include <iostream> #include <algorithm> #include <queue> using namespace std; int dx[] = { 0,0,1,-1,1,1,-1,-1 }; int dy[] = { 1,-1,0,0,1,-1,1,-1 }; int a[51][51]; int d[51][51]; int w, h; void bfs(int x, int y, int cnt) { queue<pair<int, int>> q; //좌표 큐 생성 q.push(make_pair(x, y)); //시작점 push while (!q.empty()) { int nx, ny; x = q.front().first; y = q.front().second; q.pop(); for (int i = 0; i < 8; i++) { //8방 탐색 nx = x + dx[i]; ny = y + dy[i]; if (nx >= 0 && nx < h && ny >= 0 && ny < w) { //지도안에 있다면 if (a[nx][ny] == 1 && d[nx][ny] == 0 ) { //탐색하지 않은 정점이라면 q.push(make_pair(nx, ny)); d[nx][ny] = cnt; } } } } } int main() { while (1) { cin >> w >> h; if (h == 0 && w == 0) break; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { cin >> a[i][j]; d[i][j] = 0; //초기화 } } int cnt = 0; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (a[i][j] == 1 && d[i][j] == 0) { d[i][j] = 1; bfs(i, j, ++cnt); } } } cout << cnt << '\n'; } return 0; }
'백준 문제풀이 > GRAPH' 카테고리의 다른 글
[BFS] BOJ 10026 : 적록색약 (0) 2019.10.01 [BFS] BOJ 2178 : 미로 탐색 (0) 2019.08.16 [BFS] BOJ 2667 : 단지번호붙이기 (0) 2019.08.14 [BFS] BOJ 11724 : 연결 요소 (2) 2019.07.24 [Graph] BOJ 1260 : DFS 와 BFS (0) 2019.07.22