#include<iostream>#include<queue>usingnamespace std;
constexprint NO_PATH =-1;
int A, B;
intbfs(int a, int depth) {
queue<pair<longlong, int>> to_visit;
to_visit.push({a, depth});
while (!to_visit.empty()) {
auto [cv, cd] = to_visit.front();
to_visit.pop();
// B 발견, 그리고 이것이 최단 경로이므로 빠른 종료.
if (cv == B) {
return cd;
}
// 왼쪽 자식
longlong p1 = cv *2;
// 오른쪽 자식
longlong p2 = cv *10+1;
// 왼쪽 자식이 B보다 작으면,
// 왼쪽 자식을 루트로 하는 서브트리를 탐색해 봐야함
if (p1 <= B) {
to_visit.push({p1, cd +1});
}
// 오른쪽 자식이 B보다 작으면,
// 오른쪽 자식을 루트로 하는 서브트리를 탐색해 봐야함
if (p2 <= B) {
to_visit.push({p2, cd +1});
}
}
return NO_PATH;
}
intmain() {
cin >> A >> B;
cout << bfs(A, 1);
}
#include<iostream>#include<algorithm>usingnamespace std;
constexprint NO_PATH =-1;
int A, B;
intbt(longlong k, int depth) {
// B를 일단 발견하였다.
if (k == B) {
return depth;
}
if (k < B) {
// 왼쪽과 오른쪽 자식에서 B 찾기를 시도
int l = bt(2* k, depth +1);
int r = bt(10* k +1, depth +1);
// 1. 왼쪽과 오른쪽 모두에서 B를 발견
if (l != NO_PATH && r != NO_PATH) {
return min(l, r);
// 2. 왼쪽에서만 발견
} elseif (l == NO_PATH && r != NO_PATH) {
return r;
// 3. 오른쪽에서만 발견
} elseif (l != NO_PATH && r == NO_PATH) {
return l;
}
}
// 트리를 다 뒤져봐도 B가 없습니다.
return NO_PATH;
}
intmain() {
cin >> A >> B;
cout << bt(A, 1);
}