출처:https://www.acmicpc.net/problem/13549
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
2가지의 가중치를 가지는 문제이다. 0 -1 BFS로 우선순위가 높은 친구를 앞에 넣어줌으로써 해결가능하다.
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
#define MAX_SIZE 100001
using namespace std;
int N, K;
int dist[MAX_SIZE];
void bfs()
{
deque<int> dq;
dq.push_back(N);
dist[N] = 1;
while (!dq.empty())
{
int cur = dq.front();
dq.pop_front();
if (cur == K)
return;
//*2 로 가는건 횟수가 0이므로, 걷는것 보다 먼저해주자.
if (2 * cur < MAX_SIZE && !dist[2 * cur])
{
dq.push_front(2 * cur);
dist[2 * cur] = dist[cur];
}
// +1,-1은 뒷쪽
if (cur + 1 < MAX_SIZE && !dist[cur + 1])
{
dq.push_back(cur + 1);
dist[cur + 1] = dist[cur] + 1;
}
if (cur - 1 >= 0 && !dist[cur - 1])
{
dq.push_back(cur - 1);
dist[cur - 1] = dist[cur] + 1;
}
}
}
int main()
{
cin >> N >> K;
bfs();
cout << dist[K] - 1 << '\n';
return 0;
}