알고리즘 문제풀이/백준

[백준/BOJ] 5014번 스타트링크 (C++)

노력의천재 2021. 10. 28. 17:26

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

1697번 숨바꼭질 문제와 비슷한 BFS 문제였다. 그래서 어렵지 않게 해결 ㅎ (범위 처리만 잘 해주자)

 

#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;

int F, S, G, U, D;
int visit[1000001];

int BFS() {
	queue<int> q;
	q.push(S);
	visit[S] = 0;
	
	while(!q.empty()) {
		int now = q.front();
		q.pop();
		
		if(now == G) return visit[now];
		
		if(now + U <= F && visit[now + U] == -1) {
			q.push(now + U);
			visit[now + U] = visit[now] + 1;
		}
		
		if(now - D >= 1 && visit[now - D] == -1) {
			q.push(now - D);
			visit[now - D] = visit[now] + 1;
		}
	}
	
	return -1;
}

int main(void) {
	//freopen("input.txt", "rt", stdin);
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	cin >> F >> S >> G >> U >> D;
	memset(visit, -1, sizeof(visit));
    
	int answer = BFS();
	if(answer == -1) cout << "use the stairs";
	else cout << answer;
}