반응형
백준 6593 상범 빌딩
- 3차원 bfs문제이다
- https://www.acmicpc.net/problem/6593
- 풀이 방법
1) bfs로 해결하면 된다.
2) 큐, 배열 초기화 잊지 말자 !
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int nx[6] = { 1,0,-1,0,0,0 }; //x좌표
int ny[6] = { 0,1,0,-1,0,0 }; //y좌표
int nz[6] = { 0,0,0,0,1,-1 };
char build[31][31][31]; // 빌딩 3차원 배열
int check[31][31][31];
int L, R, C; // 높이, 행, 열
struct point{
int z, x, y;
};
queue<point> q;
void input_data1(){ //L, R, C 모두 0이면 종료이기 때문에 입력 함수 따로 분리
cin >> L >> R >> C;
}
void input_data2() {
for (int i = 0; i < L; i++) {
for (int j = 0; j < R; j++) {
for (int k = 0; k < C; k++) {
cin >> build[i][j][k];
if (build[i][j][k] == 'S') {//시작점을 찾아서 큐에 push
check[i][j][k] = 1;
q.push({ i,j,k });
}
}
}
}
}
int bfs() { //3차원 배열 bfs
while (!q.empty()) {
int z = q.front().z;
int x = q.front().x;
int y = q.front().y;
q.pop();
for (int i = 0; i < 6; i++) {
int dz = nz[i] + z;
int dx = nx[i] + x;
int dy = ny[i] + y;
if (dz >= L || dz < 0 || dx >= R || dx < 0 || dy >= C || dy < 0) continue;
if (build[dz][dx][dy] == 'E') { // 찾았다 !
cout << "Escaped in " << check[z][x][y] << " minute(s)." << "\n";
return 1;
}
if (check[dz][dx][dy]) continue;
if (build[dz][dx][dy] == '.') {
q.push({ dz,dx,dy });
check[dz][dx][dy] = check[z][x][y] + 1;
}
}
}
return 0;
}
void init_arr() {
for (int i = 0; i < 31; i++) {
for (int j = 0; j < 31; j++) {
for (int k = 0; k < 31; k++) {
check[i][j][k] = 0 ;
build[i][j][k] = NULL;
}
}
}
}
void sol() {
while (1) {
input_data1();
if (L == 0 && R == 0 && C == 0) break; //종료
input_data2();
if (bfs() == 0) cout << "Trapped!\n";
while(!q.empty()) q.pop();
init_arr(); //배열 초기화
}
}
int main(void) {
sol();
}
반응형
'알고리즘 > acmicpc' 카테고리의 다른 글
[백준][2644번] 촌수계산[cpp, c++] (0) | 2020.02.15 |
---|---|
[백준][9466번] 텀 프로젝트[cpp, c++] (0) | 2020.02.14 |
[백준][2146번] 다리 만들기[cpp, c++] (0) | 2020.02.01 |
[백준][13913번] 숨바꼭질 4[cpp, c++] (0) | 2020.02.01 |
[백준][13549번] 숨바꼭질 3[cpp, c++] (0) | 2020.02.01 |