[백준/C++] 13549번 숨바꼭질 3
2021. 4. 2. 16:57ㆍ알고리즘/BFS DFS
728x90
반응형
문제: www.acmicpc.net/problem/13549
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
문제풀이
일차원 직선에서 BFS 알고리즘으로 동생(K)까지의 최단거리를 구하는 문제이다.
주의할 점은 수빈이가 걸을 때(X-1, X+1) 1초의 시간이 걸리고 순간이동(X*2)할 때에는 시간이 들지 않는다는 점이다.
그래서 큐에 다음 점을 PUSH할때 순간이동을 한 점을 먼저 넣어줘야 최단시간을 구할 수 있다.
EX)
INPUT | OUTPUT | |
걷는 것을 먼저 큐에 넣었을때 | 1 2 | 1 |
순간이동을 먼저 큐에 넣었을때 | 1 2 | 0 |
코드
#include <iostream>
#include <queue>
using namespace std;
int dist[200001];
int main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
int n,k;
cin>>n>>k;
queue<int> q;
q.push(n);
dist[n] = 1;
while(!q.empty()){
int cur = q.front();
q.pop();
if(cur == k){
cout<<dist[cur]-1;
break;
}
int xd = cur*2;
if((xd>=0 && xd<=200000) && !dist[xd]){
q.push(xd);
dist[xd] = dist[cur];
}
int xm = cur - 1;
if((xm>=0 && xm<=200000) && !dist[xm]){
q.push(xm);
dist[xm] = dist[cur] + 1;
}
int xp = cur + 1;
if((xp>=0 && xp<=200000) && !dist[xp]){
q.push(xp);
dist[xp] = dist[cur] + 1;
}
}
return 0;
}
결과

728x90
반응형
'알고리즘 > BFS DFS' 카테고리의 다른 글
[백준/C++] 1600번 말이 되고픈 원숭이 (0) | 2021.04.03 |
---|---|
[백준/C++] 6593번 상범 빌딩 (0) | 2021.04.02 |
[백준/C++] 5014번 스타트링크 (0) | 2021.04.01 |
[백준/C++] 2573번 빙산 (0) | 2021.03.31 |
[백준/C++] 5427번 불 (0) | 2021.03.31 |