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;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 9328번 열쇠 (0) | 2019.11.12 |
---|---|
[C++] 백준 6087번 레이저 통신 (0) | 2019.11.11 |
[C++] 백준 14442번 벽 부수고 이동하기 2 (0) | 2019.11.11 |
[C++] 백준 1600번 말이 되고픈 원숭이 (0) | 2019.11.11 |
[C++] 백준 4179번 불! (0) | 2019.11.10 |