No Rules Rules

상범 빌딩 (feat. 백준, 6593번) 본문

생활/코테

상범 빌딩 (feat. 백준, 6593번)

개발하는 완두콩 2022. 11. 3. 16:58
728x90
반응형

상범 빌딩
https://www.acmicpc.net/problem/6593

 

6593번: 상범 빌딩

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어

www.acmicpc.net

 

// woohyeon.kim
// kim519620.tistory.com
#include <iostream>
#include <string.h>
#include <queue>
#include <tuple>
#include <algorithm>
using namespace std;
char arr[51][51][51];
int L, R, C, dx[4], dy[4], sl, sr, sc, el, er, ec;
bool visit[51][51][51];
int bfs(register int l, register int r, register int c){
    memset(visit, false, sizeof(visit));
    register int time = -1, t, nl;
    queue<tuple<int, int, int, int>> q;
    q.push(make_tuple(l, r, c, 0));
    visit[l][r][c] = true;
    while(!q.empty()){
        auto p = q.front(); q.pop();
        l = get<0>(p), r = get<1>(p), c = get<2>(p), t = get<3>(p);
        if(l == el && r == er && c == ec){
            time = t;
            break;
        }
        for(register int d = 0, nx, ny; d < 4; ++d){
            nx = r + dx[d], ny = c + dy[d];
            if(1 <= nx && nx <= R && 1 <= ny && ny <= C && !visit[l][nx][ny] && arr[l][nx][ny] != '#')
                visit[l][nx][ny] = true, q.push(make_tuple(l, nx, ny, t + 1));
        }
        if((nl = l - 1) >= 1 && !visit[nl][r][c] && arr[nl][r][c] != '#')
            visit[nl][r][c] = true, q.push(make_tuple(nl, r, c, t + 1));
        if((nl = l + 1) <= L && !visit[nl][r][c] && arr[nl][r][c] != '#')
            visit[nl][r][c] = true, q.push(make_tuple(nl, r, c, t + 1));
    }
    return time;
}
int main() {
	ios::sync_with_stdio(false), cin.tie(NULL);
    dx[0] = 1, dx[1] = -1, dx[2] = dx[3] = 0;
    dy[0] = dy[1] = 0, dy[2] = 1, dy[3] = -1;
    while(1){
        cin >> L >> R >> C;
        if(L == 0 && R == 0 && C == 0)
            break;
        for(register int l = 1, r, c; l <= L; ++l)
            for(r = 1; r <= R; ++r)
                for(c = 1; c <= C; ++c){
                    cin >> arr[l][r][c];
                    if(arr[l][r][c] == 'S')
                        sl = l, sr = r, sc = c;
                    else if(arr[l][r][c] == 'E')
                        el = l, er = r, ec = c;
                }
        register int ans = bfs(sl, sr, sc);
        if(ans == -1)
            cout << "Trapped!\n";
        else
            cout << "Escaped in " << ans << " minute(s).\n";
    }
	return 0;
}
// *&)*@*

 

반응형

익숙한 상,하,좌,우 의 bfs에서 위와 아래 (up, down) 도 고려해야 하는 bfs 문제입니다.

728x90
반응형

'생활 > 코테' 카테고리의 다른 글

싫은데요 (feat. 백준, 25916번)  (0) 2022.11.07
돌 게임 3 (feat. 백준, 9657번)  (0) 2022.11.03
369 (feat. 백준, 17614번)  (0) 2022.11.03
성곽 (feat. 백준, 2234번)  (0) 2022.11.03
국회의원 선거 (feat. 백준, 1417번)  (0) 2022.11.03
Comments