Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
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
29 30
Archives
Today
Total
관리 메뉴

hwooo

BOJ (C/C++) 6593번: 상범 빌딩 본문

Study/Algorithm

BOJ (C/C++) 6593번: 상범 빌딩

hwooo 2022. 12. 4. 00:35

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();
	}
}