작심 24/7

[백준] 6593번 상범 빌딩 본문

백준

[백준] 6593번 상범 빌딩

모닝수박 2020. 6. 16. 00:27
 

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