반응형
리뷰
3차 배열의 BFS문제
문제 풀이
- 3차 배열을 사용해야 하므로 방향을 총 6개를 설정해 줘야 한다. 상, 하, 좌, 우, 위, 아래
- n, m, h값을 입력받고 3차 배열에 값을 넣어준다. 이때 값이 1일경우 미리 큐에 넣어주면 편하다.
- bfs를 실행하고 3차 배열의 범위 내를 탐색한다. 나는 다음 좌표가 만약 값이 0인 경우 time + 2를 해주었다.
- bfs가 종료된 후 토마토가 잘 익었는지 확인해 주어야 한다. flag와 max_val 변수를 각각 0으로 초기화 해줬다.
- 3차 배열을 돌며 만약 0이 발견되면 flag = 1, break 해준다. 그게 아니라면 max_val에 최대값을 저장해 준다.
- flag가 1일경우 -1을 출력, 0일 경우 max_val을 2로 나눈 값을 출력해 주면 된다.
참고 사항
time에 +2를 해준 이유는 최대 값을 찾을때 1인 경우(원래 있던 익은 토마토)는 배제하기 위해서이다.
정답 코드
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dx[] = { 0, 0, 0, 0, 1, -1 };
int dy[] = { 0, 0, 1, -1, 0, 0 };
int dz[] = { 1, -1, 0, 0, 0, 0 };
int n, m, h;
vector<vector<vector<int>>> lst;
struct pos {
int z, y, x, time;
};
queue<pos> dq;
void bfs() {
queue<pos> q = dq;
while (!q.empty()) {
pos now = q.front();
q.pop();
int cz = now.z, cy = now.y, cx = now.x, ctime = now.time;
for (int i = 0; i < 6; i++) {
int nz = cz + dz[i], ny = cy + dy[i], nx = cx + dx[i];
if (0 <= nz && nz < h && 0 <= ny && ny < n && 0 <= nx && nx < m && lst[nz][ny][nx] == 0) {
lst[nz][ny][nx] = ctime + 2;
q.push({ nz, ny, nx, ctime + 2 });
}
}
}
}
int main() {
cin >> m >> n >> h;
lst.resize(h, vector<vector<int>>(n, vector<int> (m)));
for (int i = 0; i < h; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < m; k++) {
int num;
cin >> num;
lst[i][j][k] = num;
if (num == 1) dq.push({ i, j, k, 0 });
}
}
}
int flag = 0, max_val = 0;
bfs();
for (int i = 0; i < h; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < m; k++) {
if (lst[i][j][k] == 0) {
flag = 1;
break;
}
if (lst[i][j][k] > max_val) {
max_val = lst[i][j][k];
}
}
}
}
if (flag) cout << -1;
else cout << max_val / 2;
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
백준 1068번 트리 C++ 깊이 우선 탐색, DFS, 트리 (0) | 2024.07.31 |
---|---|
백준 30892번 상어 키우기 C++, 우선순위 큐, 최소 힙, 최대 힙 (0) | 2024.07.30 |
백준 10026번 적록색약 C++, BFS (0) | 2024.07.28 |
백준 14502번 연구소 C++ (0) | 2024.07.28 |
백준 4179번 불! C++ (0) | 2024.07.28 |