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 <=F && 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 |
코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<iostream> | |
#include<queue> | |
#include<string.h> | |
using namespace std; | |
const int MAXN = 1000001; | |
int F,S,G,U,D; | |
int min_push[MAXN]; | |
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 <=F && 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; | |
} | |
int main(){ | |
ios_base::sync_with_stdio(0); | |
cin>>F>>S>>G>>U>>D; | |
memset(min_push, -1, sizeof(min_push) ); | |
int result = PushButtonBFS(S); | |
if(result == -1) | |
cout<<"use the stairs\n"; | |
else | |
cout<<result<<"\n"; | |
return 0; | |
} |
반응형
'알고리즘 공부 > 백준' 카테고리의 다른 글
[백준] No.12851 - 숨바꼭질 2 (C++, BFS) (0) | 2021.04.22 |
---|---|
[백준] No.5214 - 환승 (C++, BFS, 더미 노드) (0) | 2021.04.21 |
[백준] No.10265 - MT (C++, SCC, Knapscak) (0) | 2021.04.19 |
[백준] No.3109 - 빵집 (C++, DFS) (0) | 2021.04.15 |
[백준] No.16915 - 호텔 관리 (C++, 2-SAT) (0) | 2021.04.14 |