프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

문제

 

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

 

풀이

 

solved.ac 난이도: Gold 5

 

간단한 BFS 문제.

 

시작하는 층, S에서 G까지 도달할 수 있는 최소 버튼 push 수를 구해야 한다.

이는 최단 거리를 구하는데 특화된 BFS의 영역이다.

 

특정 층 floor에서 위(floor + U) 또는 아래(floor - D)층으로 이동할 때

이미 방문했다면 해당 층으로 갈 수 있는 최단 push는 이미 구했으므로 더 이상 계산할 필요가 없다.

하지만  방문 하지 않았다면 해당 층으로 가는 최소 push 수는 floor까지 도달하는데 누른 push수의  +1 이다.

 

이를 G에 도달할 때까지 반복하고 만약 도달하지 못하고 BFS가 종료되면 G까지 도달할 수 없다.

 

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
int PushButtonBFS(int start_floor){
  queue<int> que;
  que.push(start_floor);
  min_push[start_floor] = 0;
 
  int floor, up_floor, down_floor, next_cost;
  while(!que.empty()){
    floor = que.front();
    que.pop();
    
    if(floor == G)
      return min_push[floor];
 
    up_floor = floor +U;
    down_floor = floor - D;
    next_cost = min_push[floor] +1;
    if(up_floor <=&& min_push[up_floor] == -1){
      que.push(up_floor);
      min_push[up_floor] = next_cost;
    }
 
    if(down_floor >=1 && min_push[down_floor] == -1){
      que.push(down_floor);
      min_push[down_floor] = next_cost;
    }
 
  }
 
  return -1;
}
cs

 

 

코드

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/10   »
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
글 보관함