문제
정육면체는 금으로 이루어져서 나갈 수 없거나 비어있어서 지나갈 수 있게 되어있다.
금으로 막혀있어 지나갈 수 없는 칸은 '#'으로 표현되고, 비어있는 칸은 '.'으로 표현된다.
당신의 시작 지점은 'S'로 표현되고, 탈출할 수 있는 출구는 'E'로 표현된다.
각 층 사이에는 빈 줄이 있으며, 입력의 끝은 L, R, C가 모두 0으로 표현된다.
시작 지점과 출구는 항상 하나만 있다.
탈출하는데 필요한 최단 시간은?
생각할 것
층이 있었기에 3차원 벡터로 만들어주었다
코드
#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
int dl[6] = {0, 0, 0, 0, -1, 1}; // 동서남북상하
int dx[6] = {0, 0, -1, 1, 0, 0};
int dy[6] = {1, -1, 0, 0, 0, 0};
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int L, R, C;
while (true) {
// input
cin >> L >> R >> C;
if (L == 0 && R == 0 && C == 0) break;
vector<vector<vector<char>>> building(L, vector<vector<char>>(R, vector<char>(C)));
vector<vector<vector<int>>> visited(L, vector<vector<int>>(R, vector<int>(C, -1)));
queue<tuple<int, int, int>> q;
for (int l = 0; l < L; l++) {
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
cin >> building[l][r][c];
if (building[l][r][c] == 'S') {
q.push({l, r, c});
visited[l][r][c] = 0;
}
}
}
}
// 탈출
int success = false;
while (!q.empty()) {
tuple<int, int, int> cur = q.front();
q.pop();
int cl = get<0>(cur);
int cx = get<1>(cur);
int cy = get<2>(cur);
if (building[cl][cx][cy] == 'E') {
cout << "Escaped in " << visited[cl][cx][cy] << " minute(s).\\n";
success = true;
break;
}
for (int k = 0; k < 6; k++) {
int nl = cl + dl[k];
int nx = cx + dx[k];
int ny = cy + dy[k];
if (nl < 0 || nl >= L || nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
if (visited[nl][nx][ny] != -1) continue;
if (building[nl][nx][ny] != '#') {
q.push({nl, nx, ny});
visited[nl][nx][ny] = visited[cl][cx][cy] + 1;
}
}
}
if (!success) cout << "Trapped!\\n";
}
return 0;
}
반응형
'Problem solving > BOJ' 카테고리의 다른 글
[BOJ] 2468. 안전 영역 (C++) (0) | 2023.08.23 |
---|---|
[BOJ] 7785. 회사에 있는 사람 (C++) (0) | 2023.08.11 |
[BOJ] 1920. 수 찾기 (C++) (0) | 2023.08.11 |
[BOJ] 2230. 수 고르기 (C++) (0) | 2023.08.11 |