[백준/C++] 6593번 상범 빌딩
2021. 4. 2. 17:00ㆍ알고리즘/BFS DFS
728x90
반응형
문제: www.acmicpc.net/problem/6593
6593번: 상범 빌딩
당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어
www.acmicpc.net
문제풀이
3차원에서 BFS 알고리즘으로 최단거리를 구하는 문제이다.
3차원 좌표를 표현하기 위해 tuple을 사용했다.
코드
#include <iostream>
#include <queue>
#include <tuple>
using namespace std;
int dz[6] = {-1,1,0,0,0,0};
int dx[6] = {0,0,-1,1,0,0};
int dy[6] = {0,0,0,0,-1,1};
string board[30][30];
int dist[30][30][30];
int main(){
ios::sync_with_stdio(false); cin.tie(NULL);
while(true){
int l,r,c;
cin>>l>>r>>c;
if(l==0 && r==0 && c==0) break;
for(int h=0; h<l; h++){
for(int i=0; i<r; i++){
fill(dist[h][i], dist[h][i]+c, 0);
}
}
queue<tuple<int,int,int>> q;
for(int h=0; h<l; h++){
for(int i=0; i<r; i++){
cin>>board[h][i];
for(int j=0; j<c; j++){
if(board[h][i][j] == 'S'){
q.push(make_tuple(h,i,j));
dist[h][i][j] = 1;
}
}
}
}
bool flag = false;
while(!q.empty()){
tuple<int,int,int> cur = q.front();
q.pop();
if(board[get<0>(cur)][get<1>(cur)][get<2>(cur)] == 'E'){
cout<<"Escaped in "<<dist[get<0>(cur)][get<1>(cur)][get<2>(cur)]-1<<" minute(s).\n";
flag = true;
break;
}
for(int dir=0; dir<6; dir++){
int nz = get<0>(cur) + dz[dir];
int nx = get<1>(cur) + dx[dir];
int ny = get<2>(cur) + dy[dir];
if(nz<0||nz>=l||nx<0||nx>=r||ny<0||ny>=c) continue;
if(dist[nz][nx][ny] || board[nz][nx][ny] == '#') continue;
dist[nz][nx][ny] = dist[get<0>(cur)][get<1>(cur)][get<2>(cur)] + 1;
q.push(make_tuple(nz,nx,ny));
}
}
if(flag){
while(!q.empty()) q.pop();
}
else{
cout<<"Trapped!\n";
}
}
return 0;
}
결과

728x90
반응형
'알고리즘 > BFS DFS' 카테고리의 다른 글
[백준/C++] 13913번 숨바꼭질 4 (0) | 2021.04.03 |
---|---|
[백준/C++] 1600번 말이 되고픈 원숭이 (0) | 2021.04.03 |
[백준/C++] 13549번 숨바꼭질 3 (0) | 2021.04.02 |
[백준/C++] 5014번 스타트링크 (0) | 2021.04.01 |
[백준/C++] 2573번 빙산 (0) | 2021.03.31 |