-
(bfs/dfs)4963 섬의 개수Algorithm/baekjoon 2022. 2. 22. 15:51
bfs/dfs 연장선상의 문제였지만 푸는 데 시간이 오래걸렸다. 고난이 많았던 문제...
https://www.acmicpc.net/problem/4963
4963번: 섬의 개수
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도
www.acmicpc.net
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<vector> #include<algorithm> #include<queue> #define X first #define Y second using namespace std; int dx[8] = { -1,-1,-1,0,1,1,1,0 }; int dy[8] = { -1,0,1,1,1,0,-1,-1 }; int w, h; int** arr ; bool** visited; int cnt = 0; void BFS(pair<int,int>start) { queue<pair<int,int>> q; q.push(start); visited[start.X][start.Y] = false; while (!q.empty()) { pair<int, int>cur = q.front(); q.pop(); for (int i = 0; i < 8; i++) { int nx = cur.X + dx[i]; int ny = cur.Y + dy[i]; if (nx < 0 || nx >= h || ny < 0 || ny >= w) { continue; } if (visited[nx][ny] || arr[nx][ny] != 1) { continue; } visited[nx][ny] = true; q.push({ nx,ny }); } } } int main() { cin.tie(NULL); cin.sync_with_stdio(false); cout.tie(NULL); while (true) { int connectedN = 0; cin >> w >> h; if (w == 0 && h == 0) break; arr = new int* [h]; for (int i = 0; i < h; i++) { arr[i] = new int[w]; } for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { cin >> arr[i][j]; } } visited = new bool* [h]; for (int i = 0; i < h; i++) { visited[i] = new bool[w]; } for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { visited[i][j] = false; } } for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (!visited[i][j]) { if (arr[i][j]) { BFS({ i,j }); connectedN++; } } } } cout << connectedN<<"\n"; } return 0; }
'Algorithm > baekjoon' 카테고리의 다른 글
(이진 검색 트리)7662 이중 우선순위 큐 (0) 2022.02.25 (dp)1463 1로 만들기/9095 1,2,3 더하기 (0) 2022.02.22 1260 DFS와 BFS/11724 연결요소의 개수 (0) 2022.02.20 (재귀)1629 곱셈/1074 Z (0) 2022.02.19 1978 소수 찾기/2609 최대공약수와 최소공배수 (0) 2022.02.19