GitHubSeob
C++ / 백준 / 5014 / 스타트링크 본문
문제
https://www.acmicpc.net/problem/5014
5014번: 스타트링크
첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.
www.acmicpc.net
문제풀이
다른 문제가 더 있는지는 모르겠지만 큐에 집어넣기 전에 visit과 정답을 확인하냐 안 하냐에 따라서 메모리 초과가 갈렸다.
BFS로 풀었고 큐를 pair로 선언하여 현재 위치, 버튼을 누른 횟수를 push 했다.
visit벡터를 이용해서 두 번 다시 같은 층을 가지 않도록 했다.
평범한 BFS문제인 것 같다. 크게 신경 써야 할 건 없는 것 같다.
처음 시작층과 0을 큐에 집어넣고 큐가 빌 때까지 while문을 반복한다.
다음 층은 U층 올라간 층 또는 D층 내려간 층이 된다.
다음 층이 G층인지, 건물보다 높은 층이 아닌지, 1층 보다 더 낮은 층인지, 방문을 하지 않았는지를 확인한다.
큐가 빌 때까지 G층에 도착하지 못하면 계단을 이용해야 하는 층이므로 "use the stairs"를 출력한다.
코드
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<bool>visit;
int F, S, G, U, D;
vector<int>button;
void BFS() {
queue<pair<int, int>>q;
q.push({ S, 0 });
visit[S] = true;
while (!q.empty()) {
int floor = q.front().first;
int cnt = q.front().second;
q.pop();
for (int idx = 0; idx < 2; ++idx) {
int next_floor = floor + button[idx];
if (next_floor == G) {
cout << cnt + 1;
return;
}
else if (next_floor >= 1 && next_floor <= F && !visit[next_floor]) {
visit[next_floor] = true;
q.push({ next_floor,cnt + 1 });
}
}
}
cout << "use the stairs";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> F >> S >> G >> U >> D;
visit = vector<bool>(F + 1, false);
button = vector<int>{ U,-D };
if (S == G) cout << 0;
else BFS();
}
'Baekjoon > Gold' 카테고리의 다른 글
C++ / 백준 / 2580 / 스도쿠 (0) | 2021.09.30 |
---|---|
C++ / 백준 / 1759 / 암호 만들기 (0) | 2021.09.26 |
C++ / 백준 / 3108 / 로고 (0) | 2021.09.24 |
C++ / 백준 / 2186 / 문자판 (0) | 2021.09.23 |
C++ / 백준 / 1525 / 퍼즐 (0) | 2021.09.18 |