Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
반응형
문제
https://www.acmicpc.net/problem/12851
풀이
solved.ac 난이도: Gold 5
이전 문제인 [백준] 숨바꼭질(1697)의 다음 단계 문제입니다.
이전 문제는 단순히 BFS를 적용하면 풀 수 있었지만 이번에는 최단 시간으로 도달하는 방법 수 까지 구해야합니다.
각 위치의 최단 시간은 수빈이의 시작 위치로 부터 BFS를 하여 도달할 때의 탐색 깊이를 의미합니다.
만약 해당 위치로의 경로가 여러개가 있다면 여러개의 경로가 모두 해당 위치에 같은 최단 시간으로 도달 할 것 입니다.
즉, 이전 위치에 해당 위치로 도달할때 이전 위치들은 같은 깊이(최단 시간)를 가지는 노드들 입니다.
이때 이전 위치들도 여러개의 경로들을 가질 수 있으므로 해당 위치의 경로에 이전 노드의 경로 수를 더해 줍니다.
만약 해당 노드가 이미 방문되었고, 해당 노드로 최단 시간에도 도착하지 못 했다면 의미없는 경로이므로 계산할 필요가 없습니다.
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
42
43
44
45
|
pair<int,int> BFS(int start_pos, int dest_pos){
queue<int> que;
que.push(start_pos);
time_cache[start_pos] = 0;
case_cache[start_pos] = 1;
int pos,next_pos, time,case_num;
while(!que.empty()){
pos = que.front();
que.pop();
time = time_cache[pos];
case_num = case_cache[pos];
if(pos == dest_pos)
break;
for(int i=0; i<3 ; ++i){
switch(i){
case 0:
next_pos = pos -1;
break;
case 1:
next_pos = pos +1;
break;
case 2:
next_pos = pos*2;
}
if(next_pos < 0 || MAXN < next_pos ) //범위 초과 판단
continue;
if(time_cache[next_pos] == -1){//방문한적 없는 경우
que.push(next_pos);
time_cache[next_pos] = time +1;
case_cache[next_pos] = case_num;
}else if(time_cache[next_pos] == time +1){ //최단 시간에 도달하는 경로가 여러가지인 경우
case_cache[next_pos] += case_num;
}
}// for문 end;
}
return make_pair(time_cache[dest_pos], case_cache[dest_pos]);
}
|
cs |
코드
반응형
'알고리즘 공부 > 백준' 카테고리의 다른 글
[백준] No.1238 - 파티 (C++, 다익스트라) (0) | 2021.04.29 |
---|---|
[백준] No.2536 - 버스 갈아타기 (C++, BFS) (0) | 2021.04.25 |
[백준] No.5214 - 환승 (C++, BFS, 더미 노드) (0) | 2021.04.21 |
[백준] No.5014 - 스타트링크 (C++, BFS) (0) | 2021.04.20 |
[백준] No.10265 - MT (C++, SCC, Knapscak) (0) | 2021.04.19 |
댓글