3차원으로 입력이 조금 까다롭긴 하지만 탐색하던 경우가 4개에서 6개로 늘어난 것 말고는 기존의 BFS와 같은 방식으로 하면 된다!
3차원으로 늘어났기 때문에 더이상 pair로는 할 수 없고 S, E 등 시작점과 종료점을 기록해주기도 해야한다. 구조체를 만들어서 사용하자!
struct Point {
int z, y, x;
Point(int a, int b, int c) { z = a; y = b; x = c; };
Point() {};
};
3차원에 경우가 6개로 늘어났기 때문에 와 같이 6개로 늘려주면 끝!
int ml[6] = { 0, 0, 0, 0, 1, -1 };
int mr[6] = { -1, 0, 1, 0, 0, 0 };
int mc[6] = { 0, 1, 0, -1, 0, 0 };
0 0 0 일 때 종료해줘야 하기 때문에 0 0 0 외에 새로운 input을 받으면 꼭 이전의 값을 reset해줘야 한다!
void reset() {
for(int i=0; i<L; i++) {
for(int j=0; j<R; j++) {
for(int k=0; k<C; k++) {
map[i][j][k] = ' ';
}
}
}
for(int i=0; i<L; i++) {
for(int j=0; j<R; j++) {
for(int k=0; k<C; k++) {
visited[i][j][k] = 0;
}
}
}
}
풀이보기
```c++
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
struct Point {
int z, y, x;
Point(int a, int b, int c) { z = a; y = b; x = c; };
Point() {};
};
int L = 1, R = 1, C = 1;
char map[31][31][31];
int visited[31][31][31];
int ml[6] = { 0, 0, 0, 0, 1, -1 };
int mr[6] = { -1, 0, 1, 0, 0, 0 };
int mc[6] = { 0, 1, 0, -1, 0, 0 };
Point sp, ep;
void bfs() {
queue<Point> q;
q.push(sp);
while (!q.empty()) {
Point p = q.front(); q.pop();
for(int i=0; i<6; i++) {
int dl = p.z + ml[i];
int dr = p.y + mr[i];
int dc = p.x + mc[i];
if(dl<0 || dr<0 || dc<0 || dl>=L || dr>=R || dc>=C ) continue;
if(visited[dl][dr][dc]) continue;
if(map[dl][dr][dc] == '#') continue;
visited[dl][dr][dc] = visited[p.z][p.y][p.x] + 1;
q.push(Point(dl, dr, dc));
}
}
}
void reset() {
for(int i=0; i<L; i++) {
for(int j=0; j<R; j++) {
for(int k=0; k<C; k++) {
map[i][j][k] = ' ';
}
}
}
for(int i=0; i<L; i++) {
for(int j=0; j<R; j++) {
for(int k=0; k<C; k++) {
visited[i][j][k] = 0;
}
}
}
}
int main(int argc, const char * argv[]) {
while (true) {
scanf("%d %d %d", &L, &R, &C);
if ( !L && !R && !C ) break;
reset();
for(int i=0; i<L; i++) {
for(int j=0; j<R; j++) {
scanf("%s", map[i][j]);
for(int k=0; k<C; k++) {
if( map[i][j][k] == 'S') {
sp = Point(i, j, k);
} else if (map[i][j][k] == 'E') {
ep = Point(i, j, k);
}
}
}
getchar();
}
bfs();
visited[ep.z][ep.y][ep.x] > 0 ? printf("Escaped in %d minute(s).\n", visited[ep.z][ep.y][ep.x]) : printf("Trapped!\n");
}
return 0;
}
```
0 0 0이면 입력이 끝난다는 것을 파악하지 못해서 틀리고 reset을 해주지 않아서 또 틀리고… 문제를 똑바로 읽고 잔 실수를 없애자