https://www.acmicpc.net/problem/6593
코드
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
#define MAX 31
#define FASTIO ios::sync_with_stdio(false); cin.tie(NULL);
typedef pair<pair<int, int>, pair<int, int>> pii;
int dx[6] = { 0, 0, 1, -1, 0, 0 };
int dy[6] = { 1, -1, 0, 0, 0, 0 };
int dz[6] = { 0, 0, 0, 0, 1, -1 };
int l, r, c;
char arr[MAX][MAX][MAX];
bool visit[MAX][MAX][MAX];
queue<pii> q;
void init() {
memset(arr, '#', sizeof(arr));
memset(visit, false, sizeof(visit));
q = queue<pii>();
}
void bfs() {
while (!q.empty()) {
int z = q.front().first.first;
int y = q.front().first.second;
int x = q.front().second.first;
int t = q.front().second.second;
q.pop();
if (arr[z][y][x] == 'E') {
cout << "Escaped in " << t << " minute(s).\n";
return;
}
for (int i = 0, gz, gy, gx; i < 6; i++) {
gz = z + dz[i];
gy = y + dy[i];
gx = x + dx[i];
if (gx >= 0 && gx < c && gy >= 0 && gy < r && gz >= 0 && gz <= l) {
if (visit[gz][gy][gx] || arr[gz][gy][gx] == '#') continue;
q.push({ {gz, gy}, {gx, t+1} });
visit[gz][gy][gx] = true;
}
}
}
cout << "Trapped!\n";
}
int main() {
FASTIO;
while (true) {
cin >> l >> r >> c;
if (l == 0 && r == 0 && c == 0) break;
init();
for (int i = 0; i < l; i++) {
for (int j = 0; j < r; j++) {
for (int k = 0; k < c; k++) {
cin >> arr[i][j][k];
if (arr[i][j][k] == 'S') {
q.push({ {i, j}, {k, 0} });
visit[i][j][k] = true;
}
}
}
}
bfs();
}
return 0;
}
설명
먼저 정육면체 빌딩이므로 3차원 배열로 정보를 저장한다. 이후 3차원 배열을 대상으로 bfs를 돌리면 된다. 테스트 케이스형태인 문제이니 while문 내에 init 함수를 이용해서 데이터를 초기화해주었다.
느낀 점
첫 번째 코드에서는 층별로 한 줄씩 비어 있는 걸 불필요하게 getchar로 처리하려다가 출력초과가 났었다. 두 번째 코드에서는 이 부분을 지워서 제출했고, 틀렸다. 반례 게시판을 둘러보다가 arr 배열도 초기화가 필요하다고 해서 '#'으로 초기화하는 것을 init 함수에 넣어주었다. 굳이 필요성을 못 느꼈었는데, 이제부터는 의식적으로 초기화를 해둬야겠다.
'PS (C, C++)' 카테고리의 다른 글
[백준/C++] 22120 숫자판 점프 (0) | 2024.11.17 |
---|---|
[백준/C++] 13903 출근 (0) | 2024.11.16 |
[백준/C++] 14226 이모티콘 (2) | 2024.11.14 |
[백준/C++] 15723 n단 논법 (0) | 2024.11.11 |
[백준/C++] 13565 침투 (0) | 2024.11.10 |