-
[백준]c++/구현/2573Computer Science/백준 Boj 2023. 3. 4. 04:25
https://www.acmicpc.net/submit/2573/56811225
빙하 상,하,좌,우 탐색 조건에서 bfs 예상
1) bfs
2-1) 탐색 구간이 물이고, 해당 빙하 값 0 초과이면 빙하 감소
2-2) 탐색 구간 빙하이고, 방문한 적 없으면 queue 삽입
3) bfs 호출이 2번 이상이면 종료
4) 빙하 탐색 완료 -> 해 증가
5) 빙하를 한번도 탐색하지 않으면(빙하가 없음) -> 0 출력 종료
#include <bits/stdc++.h> using namespace std; /* * 빙하 해당 좌표 벡터 삽입 * 벡터 순회 * 상, 하, 좌, 우 물 확인 * 0이 아니라면 감소 * * bfs * 맵 순회 * 0이 아니면 bfs * bfs 2회 이상이면 정답 종료 * 다 녹았다. 0 출력 종료 */ int v[300][300]; bool bCheck[300][300]; int dx[4] = { -1,1,0,0 }; int dy[4] = { 0,0,-1,1 }; int n, m; int year, t; void clear() { for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { bCheck[i][j] = false; } } } void bfs(int y, int x) { ++t; queue<pair<int, int>> que; que.push({ y,x }); bCheck[y][x] = true; while (!que.empty()) { int _y = que.front().first; int _x = que.front().second; que.pop(); for (int i = 0; i < 4; ++i) { int __y = _y + dy[i]; int __x = _x + dx[i]; if (bCheck[__y][__x]) continue; if (0 > __y || __y >= n || 0 > __x || __x >= m) continue; //다른 빙산인 경우 if (0 < v[__y][__x]) { bCheck[__y][__x] = true; que.push({ __y, __x }); } //물인 경우 if (0 == v[__y][__x] && 0 < v[_y][_x]) { --v[_y][_x]; } } } } int main() { cin >> n >> m; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> v[i][j]; } } bool bRun = false; while (true) { for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (0 != v[i][j] && !bCheck[i][j]) { bRun = true; bfs(i, j); if (t > 1) { cout << year << endl; exit(0); } } } } if (!bRun) { cout << 0 << endl; exit(0); } bRun = false; clear(); t = 0; ++year; } return 0; }
'Computer Science > 백준 Boj' 카테고리의 다른 글
백준 1202 보석 도둑 (0) 2023.10.19 백준 1158 요세푸스 문제 (0) 2023.10.19 백준 1018 체스판 다시 칠하기 (0) 2023.10.19 7.1 QuickSort (0) 2023.09.06 백준/C++/구현/16234 (0) 2023.03.02