• toc {:toc}

๋ฌธ์ œ

๋‹น์‹ ์€ ์ƒ๋ฒ” ๋นŒ๋”ฉ์— ๊ฐ‡ํžˆ๊ณ  ๋ง์•˜๋‹ค. ์—ฌ๊ธฐ์„œ ํƒˆ์ถœํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๊ธธ์€ ๋ฌด์—‡์ผ๊นŒ? ์ƒ๋ฒ” ๋นŒ๋”ฉ์€ ๊ฐ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ 1์ธ ์ •์œก๋ฉด์ฒด(๋‹จ์œ„ ์ •์œก๋ฉด์ฒด)๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค. ๊ฐ ์ •์œก๋ฉด์ฒด๋Š” ๊ธˆ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ฑฐ๋‚˜, ๋น„์–ด์žˆ์–ด์„œ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด์žˆ๋‹ค. ๋‹น์‹ ์€ ๊ฐ ์นธ์—์„œ ์ธ์ ‘ํ•œ 6๊ฐœ์˜ ์นธ(๋™,์„œ,๋‚จ,๋ถ,์ƒ,ํ•˜)์œผ๋กœ 1๋ถ„์˜ ์‹œ๊ฐ„์„ ๋“ค์—ฌ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋Œ€๊ฐ์„ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ๋ฒ” ๋นŒ๋”ฉ์˜ ๋ฐ”๊นฅ๋ฉด๋„ ๋ชจ๋‘ ๊ธˆ์œผ๋กœ ๋ง‰ํ˜€์žˆ์–ด ์ถœ๊ตฌ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹น์‹ ์€ ์ƒ๋ฒ” ๋นŒ๋”ฉ์„ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆด๊นŒ?

์ž…๋ ฅ

์ž…๋ ฅ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์„ธ ๊ฐœ์˜ ์ •์ˆ˜ L, R, C๋กœ ์‹œ์ž‘ํ•œ๋‹ค.ย L(1 โ‰ค L โ‰ค 30)์€ ์ƒ๋ฒ” ๋นŒ๋”ฉ์˜ ์ธต ์ˆ˜์ด๋‹ค.ย R(1 โ‰ค R โ‰ค 30)๊ณผ C(1 โ‰ค C โ‰ค 30)๋Š” ์ƒ๋ฒ” ๋นŒ๋”ฉ์˜ ํ•œ ์ธต์˜ ํ–‰๊ณผ ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ทธ ๋‹ค์Œ ๊ฐ ์ค„์ด C๊ฐœ์˜ ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ R๊ฐœ์˜ ํ–‰์ด L๋ฒˆ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ๋ฌธ์ž๋Š” ์ƒ๋ฒ” ๋นŒ๋”ฉ์˜ ํ•œ ์นธ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ธˆ์œผ๋กœ ๋ง‰ํ˜€์žˆ์–ด ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋Š” ์นธ์€ โ€™#โ€˜์œผ๋กœ ํ‘œํ˜„๋˜๊ณ , ๋น„์–ด์žˆ๋Š” ์นธ์€ โ€™.โ€™์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค. ๋‹น์‹ ์˜ ์‹œ์ž‘ ์ง€์ ์€ โ€˜Sโ€™๋กœ ํ‘œํ˜„๋˜๊ณ , ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ถœ๊ตฌ๋Š” โ€˜Eโ€™๋กœ ํ‘œํ˜„๋œ๋‹ค. ๊ฐ ์ธต ์‚ฌ์ด์—๋Š” ๋นˆ ์ค„์ด ์žˆ์œผ๋ฉฐ, ์ž…๋ ฅ์˜ ๋์€ L, R, C๊ฐ€ ๋ชจ๋‘ 0์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค. ์‹œ์ž‘ ์ง€์ ๊ณผ ์ถœ๊ตฌ๋Š” ํ•ญ์ƒ ํ•˜๋‚˜๋งŒ ์žˆ๋‹ค.

์ถœ๋ ฅ

๊ฐ ๋นŒ๋”ฉ์— ๋Œ€ํ•ด ํ•œ ์ค„์”ฉ ๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅํ•œ๋‹ค.

Escaped in x minute(s).

์—ฌ๊ธฐ์„œ x๋Š” ์ƒ๋ฒ” ๋นŒ๋”ฉ์„ ํƒˆ์ถœํ•˜๋Š” ๋ฐ์— ํ•„์š”ํ•œ ์ตœ๋‹จ ์‹œ๊ฐ„์ด๋‹ค.

๋งŒ์ผ ํƒˆ์ถœ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅํ•œ๋‹ค.

Trapped!

์ถœ์ฒ˜: https://www.acmicpc.net/problem/6593

ํ’€์ด

ํ…Œ์ŠคํŠธ ์˜ˆ์ œ๋Š” ๋งž๋Š”๋ฐ ํ‹€๋ฆฌ๋Š” ๊ฒฝ์šฐ

  1. BFS์˜ ์กฐ๊ฑด์ด ์ž˜๋ชป๋จ
  2. ๋ฐ˜๋ณต๋ฌธ ์ธ๋ฑ์Šค๊ฐ€ ์ž˜๋ชป๋จ
  3. board, vis, queue์˜ ์ดˆ๊ธฐํ™” ๋ฌธ์ œ(ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ)
#include <bits/stdc++.h>
using namespace std;
#define X get<0>
#define Y get<1>
#define Z get<2>
 
char board[33][33][33];
int vis[33][33][33];
int level, row, column;
int dx[6] = {-1, 1, 0, 0, 0, 0};
int dy[6] = { 0, 0,-1, 1, 0, 0};
int dz[6] = { 0, 0, 0, 0, -1, 1};
queue<tuple<int, int, int>> q;
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    while(true){
        cin >> level >> row >> column;
        if(level == 0 && row == 0 && column == 0) break;
        for(int L = 0; L < level; L++){
            for(int R = 0; R < row; R++){
                for(int C = 0; C < column; C++){
                    cin >> board[L][R][C];
                    vis[L][R][C] = -1;
                    if(board[L][R][C] == 'S'){
                        q.push({C, R, L});
                        vis[L][R][C] = 0;
                    }
                }
            }
        }
        /*
        for(int L = 0; L < level; L++){
            for(int R = 0; R < row; R++){
                for(int C = 0; C < column; C++){
                    cout << board[L][R][C] << '\t';
                }
                cout << endl;
            }
            cout << endl << endl;
        }
        */
        int endflag = 0;
        while(!q.empty()){
            auto cur = q.front(); q.pop();
            for(int dir = 0; dir < 6; dir++){
                int nx = X(cur) + dx[dir];
                int ny = Y(cur) + dy[dir];
                int nz = Z(cur) + dz[dir];
                if(nx < 0 || nx >= column || ny < 0 || ny >= row || nz < 0 || nz >= level) continue;
                if(board[nz][ny][nx] == '#' || vis[nz][ny][nx] >= 0) continue;
                if(board[nz][ny][nx] == 'E'){
                    cout << "Escaped in " << vis[Z(cur)][Y(cur)][X(cur)] + 1 << " minute(s)." << endl;
                    endflag = 1;
                    break;
                }
                q.push({nx, ny, nz});
                vis[nz][ny][nx] = vis[Z(cur)][Y(cur)][X(cur)] + 1;
            }
            if(endflag) break;
        }
        /*
        for(int L = 0; L < level; L++){
            for(int R = 0; R < row; R++){
                for(int C = 0; C < column; C++){
                    cout << vis[L][R][C] << '\t';
                }
                cout << endl;
            }
            cout << endl << endl;
        }
        */
        if(!endflag) cout << "Trapped!" << endl;
        while(!q.empty()) q.pop();
    }
}