반응형
문제
풀이
전형적인 bfs 문제였습니다.
먼저 치즈의 개수를 세주고 temp에 저장합니다.
(0,0)은 무조건 공기이므로 bfs를 이용해 공기와 맞닿은 치즈들을 모두 공기로 바꿔줍니다.
다시 치즈의 개수를 세고, 치즈가 없다면 temp와 hour를 출력하고 있다면 bfs를 반복합니다.
소스 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include<iostream> #include<queue> #include<string.h> using namespace std; int map[100][100]; bool visited[100][100]; int n, m; int dx[] = { 0, 0, -1, 1 }; int dy[] = { 1, -1, 0, 0 }; int cnt = 0; int temp = 0; int hour = 0; void bfs(int a, int b) { if (visited[a][b]) return; visited[a][b] = true; queue<pair<int, int>> q; q.push(make_pair(a, b)); while(!q.empty()) { int x = q.front().second; int y = q.front().first; q.pop(); if (map[y][x] == 0) { for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && nx < m && ny >= 0 && ny < n && !visited[ny][nx]) { visited[ny][nx] = true; q.push(make_pair(ny, nx)); } } } else { map[y][x] = 0; } } } int main() { cin >> n >> m; bool checkzero = true; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> map[i][j]; } } while (1) { memset(visited, 0, sizeof(visited)); cnt = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (map[i][j] == 1) cnt++; } } if (cnt == 0) { cout << hour << endl; cout << temp << endl; break; } else { temp = cnt; bfs(0, 0); hour++; } } return 0; } | cs |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 1756] 피자 굽기 (C++) (0) | 2021.08.19 |
---|---|
[백준 5557] 1학년 (C++) (0) | 2021.08.19 |
[백준 2812] 크게 만들기 (C++) (0) | 2021.08.19 |
[백준 16234] 인구 이동 (C++) (0) | 2021.08.18 |
[백준 2075] N번째 큰 수 (C++) (0) | 2021.08.18 |