끄적끄적 코딩
article thumbnail
Published 2019. 11. 11. 20:54
[C++] 백준 6593번 상범 빌딩 알고리즘
728x90

BFS로 문제를 해결했습니다.

S지점에서 E지점으로 탈출을 해야하는데 특징으로는 3차원 형태인 점 입니다.
이동은 오른쪽, 왼쪽, 앞, 뒤, 위, 아래로 인접한 6가지 방향으로 이동할 수 있습니다.

이미 이동한 위치는 visit로 방문처리해주고 6가지 방향을 BFS를 통해서 탐색해서
성공하면 이동횟수를 출력하고 실패하면 메시지를 출력해주었습니다.

 

#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#define MAX 987654321
using namespace std;

int main(int argc, char* argv[])
{
	bool flag = false;
	int answer = 0;
	int L, R, C;
	int sz, sy, sx;
	int ez, ey, ex;
	int move[6][3] = { { 0, 0, 1 }, { 0, 1, 0 }, { 1, 0, 0 }, { 0, 0, -1 }, { 0, -1, 0 }, { -1, 0, 0 } };
	bool visit[32][32][32];
	char map[32][32][32];
	queue < pair < pair <int, int>, pair<int, int> > > q;

	while (1) {
		cin >> L >> R >> C;

		if (L == 0 && R == 0 && C == 0) {
			break;
		}

		flag = false;
		memset(visit, false, sizeof(visit));
		memset(map, '#', sizeof(map));
		
		while (!q.empty()) {
			q.pop();
		}

		for (int i = 1; i <= L; ++i) {
			for (int j = 1; j <= R; ++j) {
				for (int k = 1; k <= C; ++k) {
					cin >> map[i][j][k];

					if (map[i][j][k] == 'S') {
						sz = i;
						sy = j;
						sx = k;
					}
					else if (map[i][j][k] == 'E') {
						ez = i;
						ey = j;
						ex = k;
					}
				}
			}
		}

		q.push(make_pair(make_pair(sz, sy), make_pair(sx, 0)));

		while (!q.empty()) {
			int a = q.front().first.first;
			int b = q.front().first.second;
			int c = q.front().second.first;
			int d = q.front().second.second;
			q.pop();

			for (int i = 0; i < 6; ++i) {
				int z = a + move[i][0];
				int y = b + move[i][1];
				int x = c + move[i][2];

				if (z == ez && y == ey && x == ex) {
					answer = d + 1;
					flag = true;
					break;
				}
				if (map[z][y][x] == '.' && !visit[z][y][x]) {
					visit[z][y][x] = true;
					q.push(make_pair(make_pair(z, y), make_pair(x, d + 1)));
				}
			}
			if (flag) {
				break;
			}
		}
		if (flag) {
			cout << "Escaped in ";
			cout << answer;
			cout << " minute(s)." << endl;
		}
		else {
			cout << "Trapped!" << endl;
		}
	}
	return 0;
}

검색 태그