
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
queue를 이용해서 최단 거리를 구할 수 있다.1일 때 사용할 수 있다.
x점에 있을 때, 1초를 소요해서 앞으로 한 칸, 뒤로 한 칸 갈 수 있고 또는 바로 2x점으로 순간이동 할 수 있다. 따라서 간선의 가중치가 1로 동일하다고 할 수 없다.1로 만들 수 있다.다중 queue를 사용할 수 있다. 예를 들어, 0인 간선을 저장하는 큐, 1인 간선을 저장하는 큐, 2인 간선을 저장하는 큐 등으로 여러 큐를 만든 다음 원하는 곳에 push-pop 하도록 구현해서 가중치를 1로 만들 수 있다.deque을 이용해서 구현한다.push_back()으로 정점을 뒤로 넣어준다.push_front()로 정점을 앞으로 넣어준다.#include <iostream>
#include <algorithm>
#include <deque>
using namespace std;
int n, k, ans = INT32_MAX;
bool visited[100001];
int main(){
    cin >> n >> k;
    deque<pair<int,int>> q;
    q.push_back(make_pair(n,0));
    while(!q.empty()){
        int pos = q.front().first, t = q.front().second;
        int goPos = pos + 1, backPos = pos - 1, telePos = 2 * pos;
        q.pop_front();
        
        if(pos == k) ans = min(ans, t);
        
        if(telePos <= 100001 && !visited[telePos]){
            visited[telePos] = true;
            q.push_front({telePos, t});
        }
        if(backPos >= 0 && !visited[backPos]){
            visited[backPos] = true;
            q.push_back(make_pair(backPos, t + 1));
        }
        if(goPos <= 100001 && !visited[goPos]){
            visited[goPos] = true;
            q.push_back(make_pair(goPos, t + 1));
        }
    }
    cout << ans << '\n';
}
