Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

대웅짱님의 블로그

[5014] 스타트링크 본문

알고리즘/BOJ

[5014] 스타트링크

대웅짱 2018. 7. 3. 20:13

문제: https://www.acmicpc.net/problem/5014


빌딩의 높이 F, 스타트링크의 층 G, 현재 층 S, 위로 U층, 아래로 D층이 인풋으로 주어졌을 때


현재 층에서 목표 층 까지 최소 몇 번의 U 또는 D 버튼을 눌러야 하는지를 묻는 문제이다. 


만약 U나 D를 눌렀을 때 갈 수 없는 층이면 가지 않는다. 


Ex) F = 78, S = 50, U = 30 일 때 현재 층에서 U버튼을 누루면 80층이지만 80층은 존재하지 않는 층이기 때문에 가지 못한다.



현재 층에서 위 또는 아래 버튼을 한 번씩 눌러보고 갈 수있으면 큐에 넣어 계속해서 확인해주는 방법으로 풀었다.


즉 거리 값이 모두 1일 경우의 최단거리를 구하는 문제이므로 BFS를 이용했다.


만약 큐가 빌 때 까지 목표층에 도달하지 못한다면 가지 못한다는 뜻이므로 use the stairs를 출력해주면 된다.


버튼 수는 배열을 하나 만들어 큐에 넣을 때마다 현재 층 값에서 1씩 증가하는 방법으로 구했다.





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
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int f, s, g, u, d;
int cnt[1001000];
queue<int> qu;
int bfs(int pos) {
    cnt[pos] = 1;
    qu.push(pos);
    while (int s = (int)qu.size()) {
        while (s--) {
            int cpos = qu.front();
            qu.pop();
 
            if (cpos == g) return cnt[cpos] - 1;
 
            if (cpos - d > 0 && cnt[cpos - d] == 0) {
                cnt[cpos - d] = cnt[cpos] + 1;
                qu.push(cpos - d);
            }
            if (cpos + u <= f && cnt[cpos + u] == 0) {
                cnt[cpos + u] = cnt[cpos] + 1;
                qu.push(cpos + u);
            }
        }
    }
    return -1;
}
 
int main() {
    scanf("%d %d %d %d %d"&f, &s, &g, &u, &d);
    int res = bfs(s);
    if (res == -1) {
        puts("use the stairs");
    }
    else {
        printf("%d\n", res);
    }
    return 0;
}



'알고리즘 > BOJ' 카테고리의 다른 글

[5427] 불  (0) 2018.07.04
[2146] 다리 만들기  (0) 2018.07.04
[9518] 로마 카톨릭 미사  (0) 2018.07.03
[9997] 폰트  (0) 2018.07.02
[2823] 유턴 싫어  (0) 2018.06.26