Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 큐
- 이분 탐색
- 분할 정복
- 링크드리스트
- 크루스칼
- Knapsack
- 메모리풀
- MST
- DP
- 그리디
- dfs
- 백트래킹
- BFS
- 우선순위 큐
- 완전 탐색
- 빠른 입출력
- 시뮬레이션
- 피보나치 수
- 클래스
- 문자열
- 세그먼트 트리
- 조합
- 중복 순열
- 재귀
- 스택
- SSAFY
- 순열
- 비트마스크
- BeautifulSoup
- lis
Archives
- Today
- Total
작심 24/7
[백준] 6593번 상범 빌딩 본문
6593번: 상범 빌딩
문제 당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져
www.acmicpc.net
3차원 버전의 미로 탐색 문제이다.
출발지에서 시작하여 동, 서, 남, 북, 상, 하로 갈 수 있으면 +1된 값을 넣어준 뒤
큐에 그 위치를 넣어서 나중에 처리한다.
큐의 front가 출구면 그때까지의 값을 출력시키고
출구를 만나지 못하고 검사가 모두 끝나면 Trapped!를 출력시킨다.
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
int success = 0, z, x, y, Z, X, Y;
int dx[6] = { 0, 0, 1, 0, 0, -1 }, dy[6] = { -1, 0, 0, 1, 0, 0 }, dz[6] = { 0, 1, 0, 0, -1, 0 };
void Bfs(vector <pair<int, pair<int, int>>> v, queue <pair<int, pair<int, int>>> q, int building[][31][31], int res[][31][31], int visited[][31][31], int L, int R, int C) {
while (!q.empty()) {
z = q.front().first, x = q.front().second.first, y = q.front().second.second;
if (z == v[1].first && x == v[1].second.first && y == v[1].second.second) {
success = 1;
break;
}
visited[z][x][y] = 1;
for (int i = 0; i < 6; i++) {
Z = z + dz[i], X = x + dx[i], Y = y + dy[i];
if (Z >= 0 && Z < L && X >= 0 && X < R && Y >= 0 && Y < C && visited[Z][X][Y] == 0 && building[Z][X][Y] == 0) {
q.push(pair<int, pair<int, int>>(Z, pair<int, int>(X, Y)));
visited[Z][X][Y] = 1;
res[Z][X][Y] = res[z][x][y] + 1;
}
}
q.pop();
}
}
int main() {
int L, R, C;
while (1) {
cin >> L >> R >> C;
if (L == 0 && R == 0 && C == 0) break;
vector <pair<int, pair<int, int>>> v;
queue <pair<int, pair<int, int>>> q;
int building[31][31][31] = { 0 }, res[31][31][31] = { 0 }, visited[31][31][31] = { 0 };
string a;
for (int i = 0; i < L; i++) {
for (int j = 0; j < R; j++) {
cin >> a;
for (int k = 0; k < C; k++) {
if (a[k] == 'S') v.push_back(pair<int, pair<int, int>>(i, pair<int, int>(j, k)));
else if (a[k] == 'E') v.push_back(pair<int, pair<int, int>>(i, pair<int, int>(j, k)));
else if (a[k] == '#') building[i][j][k] = 1;
}
}
}
success = 0;
q.push(pair<int, pair<int, int>>(v[0].first, pair<int, int>(v[0].second.first, v[0].second.second)));
Bfs(v, q, building, res, visited, L, R, C);
if (success) cout <<"Escaped in "<< res[v[1].first][v[1].second.first][v[1].second.second] << " minute(s).\n";
else cout << "Trapped!\n";
}
return 0;
}
'백준' 카테고리의 다른 글
[백준] 3055번 탈출 (0) | 2020.06.16 |
---|---|
[백준] 5427번 불 (C++, JAVA) (0) | 2020.06.16 |
[백준] 1260번 DFS와 BFS (2) | 2020.06.15 |
[백준] 7562번 나이트의 이동 (0) | 2020.06.15 |
[백준] 2178번 미로 탐색 (0) | 2020.06.15 |
Comments