하다보니
6593번-상범 빌딩 본문
/*
상범 빌딩에서 탈출하는 가장 빠른 길. 각 변의 길이가 1인 정육면체로 이루어져 있다.
금으로 이루어져 자나갈 수 없거나. 비어있어서 지나갈 수 있다.
각 칸에서 인접한 6개의 칸으로 1분의 시간을 들여 이동할 수 있다.
대각선으로 이동하는 것은 불가능하다. 그리고 상범 빌딩의 바깥 면도 모두 금이라 출구로만 탈출 가능하다.
상범 빌딩 탈출 가능? 얼마나 걸림?
금은 #이고 비어있는 칸은 . 시작 지점은 S 탈출구는 E
*/
#include<bits/stdc++.h>
using namespace std;
int dx[6] = { 0, 0, 1, -1, 0, 0 };
int dy[6] = { 1, -1, 0, 0, 0, 0 };
int dh[6] = { 0, 0, 0, 0, 1, -1 };
int main() {
while (1) {
int L, R, C; //L은 빌딩의 층 수, R은 한 층의 행, C는 한 층의 열
char board[32][32][32];
int vis[32][32][32] ;
bool isescape = false;
queue<tuple<int, int, int>> q;
cin >> L >> R >> C;
if (L == 0 && R == 0 && C == 0)break;
for (int h = 0; h < L; h++) {
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
vis[i][j][h] = 0;
}
}
}
for(int h=0;h<L;h++) {
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cin >> board[i][j][h];
if (board[i][j][h] == 'S') {
vis[i][j][h] = 1;
q.push({ i,j,h });
}
}
}
}
while (!q.empty()) {
if (isescape)break;
auto cur = q.front(); q.pop();
int curX, curY, curH;
tie(curX, curY, curH) = cur;
for (int i = 0; i < 6; i++) {
int nx = curX + dx[i];
int ny = curY + dy[i];
int nh = curH + dh[i];
if (nx < 0 || nx >= R || ny < 0 || ny >= C || nh < 0 || nh >= L)continue;
if (board[nx][ny][nh] == '#' || vis[nx][ny][nh] > 0)continue;
if (board[nx][ny][nh] == 'E') {
isescape = true;
cout << "Escaped in " << vis[curX][curY][curH] << " minute(s).\n";
break;
}
vis[nx][ny][nh] = vis[curX][curY][curH] + 1;
q.push({ nx,ny,nh });
}
}
while (!q.empty())q.pop();
if (!isescape)cout << "Trapped!"<<"\n";
}
}
진짜....계속 실패라 뭐가 문제인지 30분 넘게 고민했는데.....\n 줄바꿈 안 함...현실이냐..?
제발 꼼꼼해져라~~~~
'알고리즘 풀이 > 백준' 카테고리의 다른 글
3986번-균형 잡힌 세상 (0) | 2022.03.07 |
---|---|
2630번-색종이 만들기 (0) | 2022.02.18 |
1780번-종이의 개수 (0) | 2022.02.16 |
3015번-오아시스 재결합 (0) | 2022.02.16 |
6198번-옥상 정원 꾸미기 (0) | 2022.02.09 |