직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다.
https://www.acmicpc.net/problem/6593
1. 생각의 흐름
너무나 단순한 BFS 탐색 문제이다.
우선 우리는 좌표와 몇분이 걸리는지를 저장하기 위해 Position이라는 Class를 다음과 같이 정의하자.
class Position {
public:
int x, y, z;
int minute;
public:
Position() {}
Position(int x, int y, int z, int minute) : x(x), y(y), z(z), minute(minute) {}
};
처음 input을 받을때, start, endPosition을 저장해 둔다.
이후 6방향을 탐색하면서 BFS를 진행하면 간단하게 해결되는 문제이다.
코드를 보면 좀더 빠른 이해가 될 것 이다.
2. 나의 코드
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define MAX 31
int L, R, C;
char MAP[MAX][MAX][MAX];
bool visited[MAX][MAX][MAX];
int dx[] = {0, 0, 1, -1, 0, 0};
int dy[] = {1, -1, 0, 0, 0, 0};
int dz[] = {0, 0, 0, 0, 1, -1};
class Position {
public:
int x, y, z;
int minute;
public:
Position() {}
Position(int x, int y, int z, int minute) : x(x), y(y), z(z), minute(minute) {}
};
static Position start, endPosition;
void init() {
memset(MAP, 0, sizeof(MAP));
memset(visited, false, sizeof(visited));
}
int BFS(int x, int y, int z) {
queue<Position> Q;
visited[x][y][z] = true;
Q.push(Position(x, y, z, 0));
while(!Q.empty()) {
int nowX = Q.front().x;
int nowY = Q.front().y;
int nowZ = Q.front().z;
int minute = Q.front().minute;
Q.pop();
if(nowX == endPosition.x && nowY == endPosition.y && nowZ == endPosition.z) {
return minute;
}
for(int i = 0; i < 6; i++) {
int nx = nowX + dx[i];
int ny = nowY + dy[i];
int nz = nowZ + dz[i];
if(nx < 0 || ny < 0 || nz < 0 || nx >= R || ny >= C || nz >= L) continue;
if(!visited[nx][ny][nz]) {
if (MAP[nx][ny][nz] == '.' || MAP[nx][ny][nz] == 'E') {
visited[nx][ny][nz] = true;
Q.push(Position(nx, ny, nz, minute + 1));
}
}
}
}
return -1;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
while (true) {
cin >> L >> R >> C;
if (L == 0 && R == 0 && C == 0) {
break;
}
for (int h = 0; h < L; h++) {
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cin >> MAP[i][j][h];
if (MAP[i][j][h] == 'S') {
start.x = i;
start.y = j;
start.z = h;
} else if (MAP[i][j][h] == 'E') {
endPosition.x = i;
endPosition.y = j;
endPosition.z = h;
}
}
}
}
int m = BFS(start.x, start.y, start.z);
if(m == -1) {
cout << "Trapped!" << "\n";
}else {
cout << "Escaped in " << m << " minute(s)." << "\n";
}
init();
}
return 0;
}
'Algorithm > 백준' 카테고리의 다른 글
[백준][C++/Python] 1655번: 가운데를 말해요 (251) (0) | 2022.10.10 |
---|---|
[백준][C++] 스타트와 링크 (246) (0) | 2022.09.22 |
[백준][C++] 7569번: 토마토 <241> (0) | 2022.09.01 |
[백준][C++] 2410번: 2의 멱수의 합 <240> (0) | 2022.08.18 |
[백준][C++] 2302번: 극장 좌석 <239> (0) | 2022.08.16 |
댓글