🚓 Self Study/🔓 BaekJoon
백준 BaekJoon (토마토, 7569번) C++
UKHYUN22
2022. 1. 11. 13:48
728x90
queue를 이용한 bfs를 할 때 for문의 조건을 변하지 않는 값으로 먼저 할당하고 진행하자.
여기서는 int size = q.size(); 로 먼저 size를 고정시키고 for문을 돌려야 한다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int arr[101][101][101];
int visited[101][101][101] = {0,};
int dim[6][3] = { {0,0,1}, {0,0,-1}, {0,1,0}, {0,-1,0}, {-1,0,0}, {1,0,0}};
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
int row = 0, col = 0, height =0;
queue<pair<pair<int,int>,int>> q;
cin >> col >> row >> height;
for(int h = 0 ; h < height ; h++) {
for(int i = 0 ; i < row ; i++) {
for(int j = 0 ; j < col ; j++) {
int num;
cin >> num;
if(num == 1) {
q.push({{i,j}, h});
}
arr[h][i][j] = num;
}
}
}
int count = 0;
while(!q.empty()) {
int size = q.size();
count++;
for(int j = 0 ; j < size ; j++) {
int d_row = q.front().first.first;
int d_col = q.front().first.second;
int d_height = q.front().second;
q.pop();
for(int i = 0 ; i < 6 ; i++) {
int n_row = d_row + dim[i][0];
int n_col = d_col + dim[i][1];
int n_height = d_height + dim[i][2];
if(n_row >= 0 && n_row < row && n_col >= 0 && n_col < col &&
n_height >= 0 && n_height < height && arr[n_height][n_row][n_col] == 0) {
arr[n_height][n_row][n_col] = 1;
q.push({{n_row,n_col}, n_height});
}
}
}
}
int none = 0;
for(int h = 0 ; h < height ; h++) {
for(int i = 0 ; i < row ; i++) {
for(int j = 0 ; j < col ; j++) {
if(arr[h][i][j] == 0)
none++;
}
}
}
if(none > 0) cout << "-1";
else cout << count-1;
return 0;
}