[백준/BOJ] 백준 6593번 : 상범 빌딩
2020. 8. 20. 07:57ㆍ알고리즘 문제풀이
https://www.acmicpc.net/problem/6593
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;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 9376번 : 탈옥 (0) | 2020.08.21 |
---|---|
[백준/BOJ] 백준 1504번 : 특정한 최단 경로 (0) | 2020.08.20 |
[백준/BOJ] 백준 2151번 : 거울 설치 (0) | 2020.08.20 |
[백준/BOJ] 백준 1963번 : 소수 경로 (0) | 2020.08.20 |
[백준/BOJ] 백준 9328번 : 열쇠 (0) | 2020.08.20 |