hwooo
BOJ (C/C++) 6593번: 상범 빌딩 본문
https://www.acmicpc.net/problem/6593
6593번: 상범 빌딩
당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어
www.acmicpc.net
풀이
BFS를 이용하여 출구까지의 최단 시간을 구함.Escape() 함수는 Q가 다 비워졌을 때가 아닌 출구에 도착했을 때 종료되므로 초기화 시 Q를 비우는 것도 잊지 말아야 함.
코드
#include <stdio.h>
#include <queue>
using namespace std;
int B[31][31][31];
int L, R, C;
bool visited[31][31][31];
queue <pair<int, pair<int, int>>> Q;
bool Is_in(int l, int r, int c) {
if (l < 0 || l >= L) return false;
if (r < 0 || r >= R) return false;
if (c < 0 || c >= C) return false;
if (visited[l][r][c] || !B[l][r][c]) return false;
return true;
}
void Escape() {
int l, r, c, nl, nr, nc;
int Sec[31][31][31] = { 0, };
int move[6][3] = { {1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1} };
while (!Q.empty()) {
l = Q.front().first, r = Q.front().second.first, c = Q.front().second.second;
Q.pop();
for (int i = 0; i < 6; i++) {
nl = l + move[i][0], nr = r + move[i][1], nc = c + move[i][2];
// 갈 수 있는 경우
if (Is_in(nl, nr, nc)) {
// 도착지점
if (B[nl][nr][nc] == -1) {
printf("Escaped in %d minute(s).\n", Sec[l][r][c] + 1);
return;
}
// 방문 표시 후 탐색을 위해 큐에 삽입, 해당 위치까지의 시간 기록
visited[nl][nr][nc] = true;
Q.push({ nl,{nr,nc} });
Sec[nl][nr][nc] = Sec[l][r][c] + 1;
}
}
}
printf("Trapped!\n");
}
int main() {
char c;
// input
while (1) {
scanf("%d %d %d", &L, &R, &C);
if (!L && !R && !C) return 0;
else {
for (int i = 0; i < L; i++) {
c = getchar(); // \n
for (int j = 0; j < R; j++) {
for (int k = 0; k < C; k++) {
scanf("%c", &c);
if (c == 'S') {
Q.push({ i,{j,k} });
visited[i][j][k] = true;
}
if (c == '.') B[i][j][k] = 1;
else if (c == 'E') B[i][j][k] = -1;
}
c = getchar(); // \n
}
}
}
Escape();
// init
for (int i = 0; i < L; i++) {
for (int j = 0; j < R; j++) {
for (int k = 0; k < C; k++)
B[i][j][k] = visited[i][j][k] = 0;
}
}
while (!Q.empty()) Q.pop();
}
}
'Study > Algorithm' 카테고리의 다른 글
BOJ (C/C++) 7562번: 나이트의 이동 (0) | 2022.12.04 |
---|---|
BOJ (C/C++) 1697번: 숨바꼭질 (0) | 2022.12.04 |
BOJ (C/C++) 5567번: 결혼식 (0) | 2022.12.03 |
BOJ (C/C++) 18352번: 특정 거리의 도시 찾기 (0) | 2022.12.03 |
BOJ (C/C++) 13023번: ABCDE (0) | 2022.12.03 |