[백준/BOJ] 백준 6593번 : 상범 빌딩

2020. 8. 20. 07:57알고리즘 문제풀이

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

 

6593번: 상범 빌딩

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

www.acmicpc.net

3차원 배열을 사용하여 문제를 해결했다.

 

코드

#include <iostream>
#include <algorithm>
#include <queue>
#include <utility>
#include <string>
using namespace std;

int l, r, c;
int board[30][30][30];
int discovered[30][30][30];
int depth[30][30][30];
int dxdydx[6][3] = { {0,-1,0},{-1,0,0},{0,1,0},{1,0,0},{0,0,1},{0,0,-1} };

int Solve(pair<pair<int, int>, int> start, pair<pair<int, int>, int> dest)
{
	discovered[start.first.first][start.first.second][start.second] = 1;
	depth[start.first.first][start.first.second][start.second] = 0;

	queue<pair<pair<int, int>, int>> q;
	q.push(start);

	while (!q.empty())
	{
		pair<pair<int, int>, int> here = q.front();
		q.pop();

		//목적지에 도착 했을때
		if (here.first.first == dest.first.first && here.first.second == dest.first.second && here.second == dest.second)
			return depth[here.first.first][here.first.second][here.second];

		//인접한 6개의 칸으로 가는 경우를 확인한다
		for (int i = 0; i < 6; i++)
		{
			pair<pair<int, int>, int> there = make_pair(make_pair(here.first.first + dxdydx[i][0], here.first.second + dxdydx[i][1]), here.second + dxdydx[i][2]);
			if (there.first.first >= 0 && there.first.first < r && there.first.second >= 0 && there.first.second < c && there.second >= 0 && there.second < l && board[there.first.first][there.first.second][there.second] == 0 && discovered[there.first.first][there.first.second][there.second] == 0)
			{
				discovered[there.first.first][there.first.second][there.second] = 1;
				depth[there.first.first][there.first.second][there.second] = depth[here.first.first][here.first.second][here.second] + 1;

				q.push(there);
			}
		}
	}

	return -1;
}
void Pre()
{
	for (int i = 0; i < 30; i++)
		for (int j = 0; j < 30; j++)
			for (int k = 0; k < 30; k++)
			{
				board[i][j][k] = 0;
				discovered[i][j][k] = 0;
				depth[i][j][k] = 0;
			}
}

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

	string temp;
	pair<pair<int, int>, int> start;
	pair<pair<int, int>, int> dest;
	int result;

	while (1)
	{
		Pre();

		cin >> l >> r >> c;

		if (l == 0 && r == 0 && c == 0)
			break;

		for (int i = 0; i < l; i++)
			for (int j = 0; j < r; j++)
			{
				cin >> temp;
				for (int k = 0; k < c; k++)
				{
					if (temp[k] == 'S')
					{
						start = make_pair(make_pair(j, k), i);
					}
					else if (temp[k] == 'E')
					{
						dest = make_pair(make_pair(j, k), i);
					}

					//지나갈 수 없는 칸은 board에 1로 표시
					else if (temp[k] == '#')
					{
						board[j][k][i] = 1;
					}
				}
			}
		result = Solve(start, dest);

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

	return 0;
}