PS (C, C++)

[백준/C++] 6593 상범 빌딩

최연재 2024. 11. 15. 20:39

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