[백준/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