- 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
ํ์ด
ํ ์คํธ ์์ ๋ ๋ง๋๋ฐ ํ๋ฆฌ๋ ๊ฒฝ์ฐ
- BFS์ ์กฐ๊ฑด์ด ์๋ชป๋จ
- ๋ฐ๋ณต๋ฌธ ์ธ๋ฑ์ค๊ฐ ์๋ชป๋จ
- 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();
}
}