티스토리 뷰
이번문제는 백준 6593번 상범빌딩 이예요. 제가 요즘 풀고있는 탐색문제들과 같은 종류입니다. 여기서 추가된건 상하좌우에다가 높이까지 추가된 경우인데요, 탐색에서 높이만 추가해서 탐색하면 아주 쉽게 풀 수 있는 문제입니다.
밑에는 제 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #include <iostream> #include <queue> using namespace std; typedef struct hrc { int h; int r; int c; }pos; vector<vector<vector<char>>> building; vector<vector<vector<int>>> visited; int L=1, R, C; pos from, to; int h[6] = { 0,0,0,0,1,-1 };//높이 int r[6] = { 0,1,0,-1,0,0 };//세로 int c[6] = { -1,0,1,0,0,0 };//가로 bool isSafe(int h, int r, int c) { if (h<0 || h>L - 1 || r<0 || r>R - 1 || c<0 || c>C - 1) return false; return true; //범위 벗어나는지 체크 } int bfs(pos from, pos to) { queue<pos> q; q.push(from); visited[from.h][from.r][from.c] = 1; while (!q.empty()) { pos cur = q.front(); if (building[cur.h][cur.r][cur.c] == 'E') return visited[cur.h][cur.r][cur.c];//E라면 탈출! for (int i = 0; i < 6; i++) {//6방 탐색(상하,동서남북) pos next = { cur.h + h[i],cur.r + r[i],cur.c + c[i] }; if (isSafe(next.h, next.r, next.c) && !visited[next.h][next.r][next.c] && building[next.h][next.r][next.c] != '#') { q.push(next); //너비탐색을 하면서 조건에 맞으면 큐에 삽입 visited[next.h][next.r][next.c] = visited[cur.h][cur.r][cur.c] + 1;//이동거리 } } q.pop(); } return 0; } int main(void) { while (true) { cin >> L >> R >> C; if (L == 1 && R == 1 && C == 1) {//1,1,1 cout << "Trapped!" << endl; continue; } else if (L == 0 && R == 0 && C == 0) break;//종료 else { building.resize(L);//높이 visited.resize(L); //설정 for (int i = 0; i < L; i++) { building[i].resize(R);//세로 visited[i].resize(R); //설정 for (int k = 0; k < R; k++) { building[i][k].resize(C);//가로 visited[i][k].resize(C); //설정 } } for (int i = 0; i < L; i++) { for (int k = 0; k < R; k++) { for (int t = 0; t < C; t++) { cin >> building[i][k][t];//입력 if (building[i][k][t] == 'S') {//시작점 from.h = i; from.r = k; from.c = t; } if (building[i][k][t] == 'E') {//도착점 to.h = i; to.r = k; to.c = t; } } cin.ignore();//문자를 입력받기에 '\n'버퍼를 지워요 } } if (bfs(from, to)) {// cout << "Escaped in " << visited[to.h][to.r][to.c] - 1 << " minute(s)." << endl; } else cout << "Trapped!" << endl; visited.clear(); } } return 0; } | cs |
'Coding > acmicpc' 카테고리의 다른 글
백준 5014:스타트링크 (0) | 2018.04.16 |
---|---|
백준 7576:토마토 (0) | 2018.04.16 |
백준 12851, 13549, 13913:숨바꼭질 시리즈.. feat.순간이동 (8) | 2018.04.03 |
백준 9663:숨바꼭질 (0) | 2018.03.26 |
백준 7562:나이트의 이동 (0) | 2018.03.26 |