Deff_Dev
[백준] 상범 빌딩 (C++) 본문
문제
https://www.acmicpc.net/problem/6593
풀이
이 문제는 3차원 공간의 빌딩에서 BFS를 이용하여 시작 지점부터 탈출 지점까지의 최단 거리를 구하는 방식으로 풀이했다.
최단 거리를 저장하기 위해 벽(#)을 -1, 길(.)을 -2로 변환하여 map에 저장했다.
시작 지점에서 BFS를 진행했으며, 같은 층에서는 상하좌우로 이동이 가능하고, 층 간에는 위아래로 이동할 수 있어 각 지점에서 총 6방향으로 탐색을 진행했다.
모든 탐색이 끝나고 도착 지점의 값이 -2이라면 Trapped! 출력, -2가 아니라면 Escaped in 도착지점 값 minute(s).을 출력한다.
#include<iostream>
#include<queue>
// https://www.acmicpc.net/problem/6593
using namespace std;
int dx[4] = { 0 , 0,1,-1 };
int dy[4] = { 1,-1,0,0 };
int L, R, C;
int map[31][31][31];
pair<int, pair<int, int>> startPos;
pair<int, pair<int, int>> escapePos;
void BFS() {
queue <pair<int, pair<int, int>>> q;
q.push(startPos);
map[startPos.first][startPos.second.first][startPos.second.second] = 0;
while (!q.empty()) {
pair<int, pair<int, int>> front = q.front();
int curPosX = front.second.second;
int curPosY = front.second.first;
int curFloor = front.first;
q.pop();
for (int i = 0; i < 4; i++) { // 같은 층 동서남북 이동
int moveY = curPosY + dy[i];
int moveX = curPosX + dx[i];
if (moveY < 0 || moveX < 0 || moveY >= R || moveX >= C)
continue;
if (map[curFloor][moveY][moveX] == -2 || map[curFloor][moveY][moveX] > map[curFloor][curPosY][curPosX] + 1) {
map[curFloor][moveY][moveX] = map[curFloor][curPosY][curPosX] + 1;
q.push({ curFloor, { moveY,moveX } });
}
}
for (int i = 0; i < 2; i++) { // 층 간(상하) 이동
int moveF = curFloor + dy[i];
if (moveF < 0 || moveF >= L)
continue;
if (map[moveF][curPosY][curPosX] == -2 || map[moveF][curPosY][curPosX] > map[curFloor][curPosY][curPosX] + 1) {
map[moveF][curPosY][curPosX] = map[curFloor][curPosY][curPosX] + 1;
q.push({ moveF, { curPosY,curPosX } });
}
}
}
}
int main() {
while (true) {
cin >> L >> R >> C;
if (L == 0 && R == 0 && C == 0) {
break;
}
char sel;
for (int i = 0; i < L; i++) { // 입력
for (int j = 0; j < R; j++) {
for (int k = 0; k < C; k++) {
cin >> sel;
if (sel == '#') {
map[i][j][k] = -1;
}
else {
map[i][j][k] = -2;
if (sel == 'S') {
startPos = { i, { j,k } };
}
else if (sel == 'E') {
escapePos = { i, { j,k } };
}
}
}
}
}
BFS();
if (map[escapePos.first][escapePos.second.first][escapePos.second.second] == -2) {
cout << "Trapped!" << endl;
}
else {
int count = map[escapePos.first][escapePos.second.first][escapePos.second.second];
cout << "Escaped in " << count << " minute(s)." << endl;
}
}
return 0;
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 15988번 1, 2, 3 더하기 3 (C++) (0) | 2024.08.28 |
---|---|
[백준] 1158번 요세푸스 문제 (C++) (0) | 2024.08.28 |
[백준] 경쟁적 전염 (C++) (0) | 2024.08.27 |
[백준] 2563번 색종이 (C++) (0) | 2024.08.26 |
[백준] 1138번 한 줄로 서기 (C++) (0) | 2024.08.26 |