728x90
1. 문제 설명
2. 풀이 과정
- 문제 해결의 흐름
- 7569 토마토 문제와 매우 비슷한듯?
- 무한 루프를 통해 0 0 0이 입력될 때까지 입력 받도록 하자 ! (단, 무한 루프를 통해 여러 테스트케이스를 거치기에 입력 받을 때 초기화는 필수다!)
- 시작 지점부터 6방향을 탐색하며 방문하지 않았고 막힌 곳(#)이 아니라면 이동하자! (막힌 곳이 아니라면 도착지점 E이거나 지나갈 수 있는 곳 .이다)
- 계속 이동하다가 도착 지점(E)을 만나면 이동시간을 반환하자.
- 나의 코드
#include <iostream>
#include <queue>
using namespace std;
// 상범 빌딩 좌표값 자료형
struct coordinate {
int height;
int rows;
int cols;
};
// 6방향 탐색
int dc[6] = {0, 0, -1, 1, 0, 0}; // 열 이동
int dr[6] = {-1, 1, 0, 0, 0, 0}; // 행 이동
int dh[6] = {0, 0, 0, 0, -1, 1}; // 위 아래 이동
int L, R, C; // L : 상범 빌딩 층 수 , R : 한 층의 행 수, C : 한 층의 열 수
char building[31][31][31]; // 상범 빌딩 좌표값
queue<coordinate> q;
int visited[31][31][31] = {}; // 전부 0으로 초기화
int bfs() {
while(!q.empty()) {
// 현재 위치
int cur_h = q.front().height;
int cur_r = q.front().rows;
int cur_c = q.front().cols;
q.pop();
// 도착 지점이라면 이동시간 반환하기
if (building[cur_h][cur_r][cur_c] == 'E') return visited[cur_h][cur_r][cur_c];
// 6방향 탐색
for (int i = 0; i < 6; i++) {
int next_h = cur_h + dh[i];
int next_r = cur_r + dr[i];
int next_c = cur_c + dc[i];
// 범위 밖이면 continue
if (next_h < 0 || next_h >= L || next_r < 0 || next_r >= R || next_c < 0 || next_c >= C) continue;
// 아직 가보지 않은 곳이고 #이 아니라면 이동 (#이 아니란 것은 .이거나 E라는 뜻)
if (visited[next_h][next_r][next_c] == 0 && building[next_h][next_r][next_c] != '#') {
coordinate next_coordinate = {next_h,next_r,next_c};
q.push(next_coordinate);
visited[next_h][next_r][next_c] = visited[cur_h][cur_r][cur_c] + 1; // 이동 시간 + 1
}
}
}
return 0;
}
int main() {
while(true) {
cin >> L >> R >> C;
// 무한 루프 종료 조건
if (L == 0 && R == 0 && C == 0) break;
// visited 배열 초기화
fill_n(&visited[0][0][0], 31 * 31 * 31, 0);
// queue 초기화
while (!q.empty()) {
q.pop();
}
// 입력 받기
for (int l = 0; l < L; l++) {
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
char val;
cin >> val;
building[l][r][c] = val;
if (val == 'S') { // 시작 지점 넣어주기
coordinate s = {l, r, c};
q.push(s);
}
}
}
}
// 출력하기
int result = bfs();
if (result != 0) {
cout << "Escaped in " << result << " minute(s)." << endl;
} else {
cout << "Trapped!" << endl;
}
}
return 0;
}
- 이 문제를 통해 얻어갈 수 있는 것들
- 이 문제와 같이 입력이 여러 테스트케이스가 주어질 때, 전역 변수의 초기화 과정이 올바르게 이루어지는지 반드시 확인해야 한다!
- bfs 문제를 풀 때 queue에 push되는 값들과 문제 종료 조건을 만족하는 값이 나오는 과정에 집중하여야 한다!!!
3. 후기
7569 3차원 토마토를 풀었기에 비교적 쉬웠던 문제!
'Algorithm > graph' 카테고리의 다른 글
[백준] 16234 인구이동 C++ (1) | 2024.04.22 |
---|---|
[백준] 14226 이모티콘 C++ (1) | 2024.04.20 |
[백준] 1303 전쟁 - 전투 C++ (0) | 2024.04.19 |
[벡준] 17086 아기 상어 2 C++ (1) | 2024.04.19 |
[백준] 2206 벽 부수고 이동하기 C++ (1) | 2024.04.19 |