백준 A -> B [c++]
16953 A -> B 실버 2
문제
정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
2를 곱한다. 1을 수의 가장 오른쪽에 추가한다. A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
입력
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
출력
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
풀이
A에서 B로 가는 최소값을 찾는 문제로, 초기값이 A < B 이고 A는 계속 커져 B에 도달하거나 못한다.
BFS를 사용해 모든 경우를 탐색하면서 A가 B보다 커지면 pop한다.
사용할 수 있는 연산인 X2 연산과 오른쪽에 1을 추가하는 연산은 겹칠일이 없다. (2배수를 해서 1의 자리가 1이 나오지 못함)
= visited 안써도 됨.
BFS만 써도 해결되는 문제. (주의 : 결과 값이(cnt) int범위를 초과할 수 있어, long long 사용)
코드
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
long long a, b;
long long bfs()
{
queue <pair<long long, long long> > q;
q.push(make_pair(a,0));
while(!q.empty())
{
long long num = q.front().first;
long long cnt = q.front().second;
q.pop();
if(num == b)
{
return cnt;
} else if(num > b)
{
continue;
} else {
q.push(make_pair(num*2, cnt+1));
q.push(make_pair(num*10 + 1, cnt + 1));
}
}
return -1;
}
int main()
{
cin >> a >> b;
long long answer = bfs();
if(answer > 0)
{
cout << answer + 1 << endl;
} else{
cout << -1 << endl;
}
return 0;
}