반응형

문제링크: https://www.acmicpc.net/problem/6593

 

6593번: 상범 빌딩

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

www.acmicpc.net

 

BFS, DFS 문제입니다! 근데 이 문제는 DFS 풀이법을 허용하지 않았습니다. 

최단거리를 구할때는 BFS를 사용하는 습관을 가져야겠습니다.

 

 

기본적인 BFS문제입니다. 기존에는 4방향으로 이동하지만 6방향으로  이동한다는 차이점만 있습니다. 

토마토 6방향문제와 동일한 문제입니다.

 

너무 일반적인 문제라 설명은 생략하겠습니다.

 

 

정답코드입니다.

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

int l = 0, r = 0, c = 0;
int result;
char arr[31][31][31];
int visited[31][31][31];
int y_ar[6] = { 0, 0, 1, -1, 0, 0 };
int x_ar[6] = { 0, 0, 0, 0, 1, -1 };
int z_ar[6] = { 1, -1, 0, 0, 0, 0 };



void bfs(int sz,int sy,int sx) {
	
	queue <int> que[3];
	que[0].push(sz);
	que[1].push(sy);
	que[2].push(sx);
	visited[sz][sy][sx] = 1;
	while (que[0].empty() != 1) {


		int zz = que[0].front();
		int yy = que[1].front();
		int xx = que[2].front();
		que[0].pop(), que[1].pop(), que[2].pop();
		
		for (int i = 0; i < 6; i++) {
			int z = zz + z_ar[i];
			int y = yy + y_ar[i];
			int x = xx + x_ar[i];

			if (z >= 0 && z < l && y >= 0 && y < r && x >= 0 && x < c)
				if (visited[z][y][x] == 0 && arr[z][y][x] != '#') {
					visited[z][y][x] = visited[zz][yy][xx] + 1;
					que[0].push(z);
					que[1].push(y);
					que[2].push(x);
				}
		}
	}

	for (int i = 0; i < l; i++)
		for (int j = 0; j < r; j++)
			for (int k = 0; k < c; k++)
				if (arr[i][j][k] == 'E')
					result = visited[i][j][k];



}

int main() {
	cin.tie(NULL);
	ios::sync_with_stdio(false);

	while (1) {
		cin >> l >> r >> c;
		if (l == 0 && r == 0 && c == 0)
			break;

		memset(visited, 0, sizeof(visited));

		result = (int)2e9;
		int sz, sy, sx;

		for (int i = 0; i < l; i++)
			for (int j = 0; j < r; j++) {
				cin >> arr[i][j];

				for (int k = 0; k < c; k++) {
					if (arr[i][j][k] == 'S')
						sz = i, sy = j, sx = k;
				}
			}
	
		bfs(sz, sy, sx);
		

		if (result == 0)
			cout << "Trapped!" <<"\n";
		else
			cout << "Escaped in " << result  - 1<< " minute(s)." <<"\n";
	}

	return 0;
}

 

반응형

'알고리즘 > BFS' 카테고리의 다른 글

[백준] 1261-알고스팟(C++)  (0) 2020.08.25
[백준] 9019-DSLR  (0) 2020.08.10
[백준] 4179-불!(C++)  (0) 2020.05.06
[백준] 5427-불(C++)  (0) 2020.05.06
[백준] 2206-벽 부수고 이동하기(C++)  (0) 2020.04.03

+ Recent posts