티스토리 뷰
반응형
백준 6593번 상범 빌딩
https://www.acmicpc.net/problem/6593
정답 코드
#include<iostream>
#include<queue>
using namespace std;
char arr[31][31][31];
int time1[31][31][31];
bool vis[31][31][31];
int dir[6][3] = {
{1,0,0},
{-1,0,0},
{0,1,0},
{0,-1,0},
{0,0,-1},
{0,0,1}
};
void clear() {
for (int i = 0; i < 31; i++) {
for (int j = 0; j < 31; j++) {
for (int k = 0; k < 31; k++) {
time1[i][j][k] = -1;
vis[i][j][k] = false;
}
}
}
}
void bfs(int l, int r, int c) {
int flag = 0;
queue<pair<int, pair<int, int>>>q;
for (int i = 0; i < l; i++) {
for (int j = 0; j < r; j++) {
for (int k = 0; k < c; k++) {
cin >> arr[i][j][k];
if (arr[i][j][k] == 'S') {
q.push({ i,{j ,k} });
vis[i][j][k] = true;
time1[i][j][k] = 0;
}
}
}
}
while (!q.empty()) {
int x1 = q.front().first;
int y1 = q.front().second.first;
int z1 = q.front().second.second;
q.pop();
for (int x = 0; x < 6; x++) {
int mx = x1 + dir[x][0];
int my = y1 + dir[x][1];
int mz = z1 + dir[x][2];
if (mx < 0 || my < 0 || mz < 0 || mx >= l || my >= r || mz >= c)
continue;
if (time1[mx][my][mz] >= 0 || vis[mx][my][mz] || arr[mx][my][mz] == '#')
continue;
if (arr[mx][my][mz] == 'E') {
flag = 1;
cout << "Escaped in " << time1[x1][y1][z1] + 1 << " minute(s)." << '\n';
}
q.push({ mx,{my,mz} });
vis[mx][my][mz] = true;
time1[mx][my][mz] = time1[x1][y1][z1] + 1;
}
}
if (flag == 1)
return;
else {
cout << "Trapped!" << '\n';
return;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
while (true) {
clear();
int l, r, c;
cin >> l >> r >> c;
if (l == 0 && r == 0 && c == 0)
break;
bfs(l, r, c);
}
}
문제 풀이
bfs를 사용해서 풀었습니다. 6방향으로 움직이기 위한 배열을 만들고 clear함수를 통해 time배열과 vis배열값을 각각 -1과 false로 초기화시키도록 하였습니다.
l과 r,c가 0이면 종료하도록 하였고 입력을 받으면서 S좌표값을 바로 큐에 넣고 그에 맞는 vis배열값을 true로 time배열값을 0으로 바꾸었습니다. 그리고 나서 bfs를 돌렸습니다.
배열의 범위, 이미 방문한 곳이거나 막혀있는 칸(time값이 0이상이거나 vis값이 true인 곳)은 continue시켰습니다. E에 도착할 경우에는 그 좌표값에 해당하는 time배열값에 +1을 해주어서 출력했습니다. E가 끝이 아니라 배열을 벗어나야지 탈출이기 때문입니다. 그리고 이 경우에는 flag값을 바꿔주어서 bfs함수가 정답을 출력하도록 하였고 그게 아니라면 Trapped를 출력하도록 하였습니다.
반응형
'Algorithm > BOJ' 카테고리의 다른 글
백준 6718번 C++ (0) | 2023.08.21 |
---|---|
백준 6603번 C++ (0) | 2023.08.21 |
백준 6588번 C++ (0) | 2023.08.21 |
백준 6219번 C++ (0) | 2023.08.21 |
백준 5800번 C++ (0) | 2023.08.21 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- HTML5
- DFS
- 에라토스테네스의 체
- CSS
- 스택
- 세그먼트 트리
- Do it!
- BFS
- 스프링 부트 crud 게시판 구현
- 카운팅 정렬
- 우선순위 큐
- 백준 풀이
- 백준
- 자바스크립트
- 자료구조
- html
- java
- 자바
- C++
- 반복문
- 유클리드 호제법
- js
- 유니온 파인드
- 알고리즘
- 이분 매칭
- 알고리즘 공부
- DP
- C++ Stack
- 투 포인터
- c++ string
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함