문제 분석
해당 문제는 Z축이 포함된 3차원에서의 BFS를 계산하는 것이다.
해결 방법
세로 칸 수를 X, 가로 칸 수를 Y, 높이를 Z 로 하여 3차원 배열으로 접근한다.
코드
#include <iostream>
#include <tuple>
#include <queue>
using namespace std;
int board[101][101][101];
int dx[6]={1,0,-1,0,0,0};
int dy[6]={0,1,0,-1,0,0};
int dz[6]={0,0,0,0,1,-1};
int main() {
int n,m,h,status,max=1;
queue<tuple<int,int,int>> q;
cin >> m >> n >> h;
for(int k=0;k<h;k++) {
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
cin >> status;
board[i][j][k] = status;
if(status == 1) {
q.push({i,j,k});
}
}
}
}
while(!q.empty()) {
tuple<int,int,int> cur = q.front();
q.pop();
for(int dir=0;dir<6;dir++) {
int nx = get<0>(cur) + dx[dir];
int ny = get<1>(cur) + dy[dir];
int nz = get<2>(cur) + dz[dir];
if(nx<0||ny<0||nz<0) continue;
if(nx>=n||ny>=m||nz>=h) continue;
if(board[nx][ny][nz] != 0) continue;
q.push({nx,ny,nz});
board[nx][ny][nz] = board[get<0>(cur)][get<1>(cur)][get<2>(cur)] + 1;
}
}
for(int k=0;k<h;k++) {
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(board[i][j][k] == 0){
cout << -1;
return 0;
}
max = board[i][j][k] > max ? board[i][j][k] : max;
}
}
}
cout << max -1;
}
- tuple
이 전 포스팅에서 다룬 pair와 같은 개념이지만, pair는 인자를 최대 2개 까지 밖에 만들지 못하지만, tuple은 3개 이상을 만들 수 있다.
#include <tuple>
queue<tuple<int,int,int>> q;
q.push(make_tuple(1,2,3));
q.push({1,2,3});
header 파일은 "tuple" 이다.
make_tuple을 사용하여 값을 넣어줄 수도 있고, { ] 를 사용해서 넣어줄 수 있다.
get<0>(q.front()) 로 1을,
get<1>(q.front()) 로 2를,
get<2>(q.front()) 로 3을 접근할 수 있다.
참고 링크
'BOJ > BFS' 카테고리의 다른 글
[C++] BOJ 2667 / BFS (문자열 파싱 접근) (0) | 2021.07.21 |
---|---|
[C++] BOJ 2583 / BFS (sort 사용) (0) | 2021.07.20 |
[C++] BOJ 1697 / BFS (fill, range based for 사용) (0) | 2021.07.19 |
[C++] BOJ 7576 / BFS 응용(시작점이 여러 개) (0) | 2021.07.19 |
BFS 기본 틀 (0) | 2021.07.19 |