-
[백준 6593] 상범 빌딩C 프로그래밍/BOJ 2022. 12. 7. 17:44728x90
https://www.acmicpc.net/problem/6593
#include <cstdio> #include <cstring> #include <queue> int L, R, C; char building[30 + 2][30 + 2][30 + 2]; int sz, sx, sy; int ez, ex, ey; struct _st { int z, x, y; int move; }; std::queue<_st> Q; int visited[30 + 2][30 + 2][30 + 2]; void input() { // init memset(building, 0, sizeof(building)); sz = sx = sy = 0; ez = ex = ey = 0; for (int k = 1; k <= L; k++) { for (int r = 0; r < R; r++) { scanf("%s", &building[k][r]); for (int c = 0; c < C; c++) { if (building[k][r][c] == 'S') { sz = k; sx = r; sy = c; } if (building[k][r][c] == 'E') { ez = k; ex = r; ey = c; } } } } } int BFS() { // dir int dir_x[4] = { 0, 0 ,1, -1 }; int dir_y[4] = { 1, -1, 0, 0 }; int dir_z[2] = { -1, 1 }; // init Q = {}; memset(visited, 0, sizeof(visited)); Q.push({ sz, sx, sy, 0 }); visited[sz][sx][sy] = 1; while (!Q.empty()) { _st data = Q.front(); Q.pop(); if (data.z == ez && data.x == ex && data.y == ey) return data.move; // 동서남북 이동 for (int p = 0; p < 4; p++) { int nx = data.x + dir_x[p]; int ny = data.y + dir_y[p]; if (nx < 0 || nx > R - 1 || ny < 0 || ny > C - 1) continue; if (building[data.z][nx][ny] == '#') continue; if (visited[data.z][nx][ny]) continue; Q.push({ data.z, nx, ny, data.move + 1 }); visited[data.z][nx][ny] = 1; } // 상하 이동 for (int p = 0; p < 2; p++) { int nz = data.z + dir_z[p]; if (nz < 1 || nz > L) continue; if (building[nz][data.x][data.y] == '#') continue; if (visited[nz][data.x][data.y]) continue; Q.push({ nz, data.x, data.y, data.move + 1 }); visited[nz][data.x][data.y] = 1; } } return -1; } int main() { while (1) { scanf("%d %d %d", &L, &R, &C); if (L == 0 && R == 0 && C == 0) break; input(); int ans = BFS(); if (ans == -1) printf("Trapped!\n"); else printf("Escaped in %d minute(s).\n", ans); } return 0; }
동서남북으로 이동할 때와 상하로 이동할 때 따로 루프를 돌려주었다.
나머지는 일반 BFS와 동일하다
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 17406] 배열 돌리기4 (0) 2022.12.11 [백준 16920] 확장 게임 (0) 2022.12.08 [백준 22255] 호석사우루스 (0) 2022.12.06 [백준 8972] 미친 아두이노 (0) 2022.12.06 [백준 1261] 알고스팟 (0) 2022.12.06