티스토리 뷰

Algorithm/BOJ

백준 6593번 C++

poopooreum 2023. 8. 21. 13:48
반응형
백준 6593번 상범 빌딩

https://www.acmicpc.net/problem/6593

6593번: 상범 빌딩

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어

www.acmicpc.net



정답 코드

#include<iostream>
#include<queue>
using namespace std;
char arr[31][31][31];
int time1[31][31][31];
bool vis[31][31][31];
int dir[6][3] = {
	{1,0,0},
	{-1,0,0},
	{0,1,0},
	{0,-1,0},
	{0,0,-1},
	{0,0,1}
};
void clear() {
	for (int i = 0; i < 31; i++) {
		for (int j = 0; j < 31; j++) {
			for (int k = 0; k < 31; k++) {
				time1[i][j][k] = -1;
				vis[i][j][k] = false;
			}
		}
	}
}
void bfs(int l, int r, int c) {
	int  flag = 0;
	queue<pair<int, pair<int, int>>>q;
	for (int i = 0; i < l; i++) {
		for (int j = 0; j < r; j++) {
			for (int k = 0; k < c; k++) {
				cin >> arr[i][j][k];
				if (arr[i][j][k] == 'S') {
					q.push({ i,{j ,k} });
					vis[i][j][k] = true;
					time1[i][j][k] = 0;
				}
			}
		}
	}
	while (!q.empty()) {
		int x1 = q.front().first;
		int y1 = q.front().second.first;
		int z1 = q.front().second.second;
		q.pop();
		for (int x = 0; x < 6; x++) {
			int mx = x1 + dir[x][0];
			int my = y1 + dir[x][1];
			int mz = z1 + dir[x][2];
			if (mx < 0 || my < 0 || mz < 0 || mx >= l || my >= r || mz >= c)
				continue;
			if (time1[mx][my][mz] >= 0 || vis[mx][my][mz] || arr[mx][my][mz] == '#')
				continue;
			if (arr[mx][my][mz] == 'E') {
				flag = 1;
				cout << "Escaped in " << time1[x1][y1][z1] + 1 << " minute(s)." << '\n';
			}
			q.push({ mx,{my,mz} });
			vis[mx][my][mz] = true;
			time1[mx][my][mz] = time1[x1][y1][z1] + 1;
		}
	}
	if (flag == 1)
		return;
	else {
		cout << "Trapped!" << '\n';
		return;
	}
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	while (true) {
		clear();
		int l, r, c;
		cin >> l >> r >> c;
		if (l == 0 && r == 0 && c == 0)
			break;
		bfs(l, r, c);
	}

}

문제 풀이

bfs를 사용해서 풀었습니다. 6방향으로 움직이기 위한 배열을 만들고 clear함수를 통해 time배열과 vis배열값을 각각 -1과 false로 초기화시키도록 하였습니다.
l과 r,c가 0이면 종료하도록 하였고 입력을 받으면서 S좌표값을 바로 큐에 넣고 그에 맞는 vis배열값을 true로 time배열값을 0으로 바꾸었습니다. 그리고 나서 bfs를 돌렸습니다.
배열의 범위, 이미 방문한 곳이거나 막혀있는 칸(time값이 0이상이거나 vis값이 true인 곳)은 continue시켰습니다. E에 도착할 경우에는 그 좌표값에 해당하는 time배열값에 +1을 해주어서 출력했습니다. E가 끝이 아니라 배열을 벗어나야지 탈출이기 때문입니다. 그리고 이 경우에는 flag값을 바꿔주어서 bfs함수가 정답을 출력하도록 하였고 그게 아니라면 Trapped를 출력하도록 하였습니다.

반응형

'Algorithm > BOJ' 카테고리의 다른 글

백준 6718번 C++  (0) 2023.08.21
백준 6603번 C++  (0) 2023.08.21
백준 6588번 C++  (0) 2023.08.21
백준 6219번 C++  (0) 2023.08.21
백준 5800번 C++  (0) 2023.08.21
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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 31
글 보관함