A->B 덱을 이용해서 해결 할 수 있는 문제였다. 그런데 몇 가지 실수를 통해 정답 도출간 시간이 걸렸다. 문제를 살펴보면 조건 없이 두가지 연산이 주어진다.
#2를 곱한다.
#1을 수의 가장 오른쪽에 추가한다.
이 두가지 경우의 수를 모두 통해 나온 결과를 얻어야 하는데 두개중 하나의 연산만을 실행하게 코드를 짜버렸다.
//잘못된 코드
if (now.first == result) {
return now.second;
}
else if (now.first * 2 <= result) {
// 재귀 호출때 now.first * 2도 아닌 now.first를 넘겨버리는 실수도 저질렀다.
ary.push_back(make_pair(now.first * 2, now.second + 1));
}
else if (now.first * 10 + 1 <= result) {
// 재귀 호출때 now.first * 10 +1 도 아닌 now.first를 넘겨버리는 실수도 저질렀다.
ary.push_back(make_pair(now.first * 10 + 1, now.second + 1));
}
//정답 코드
#include <iostream>
#include <deque>
#include <string>
#include <sstream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
#define MAX 1000001
using namespace std;
int a, b;
int bfs(int start,int result) {
deque<pair<long long, long long>> ary;
ary.push_back(make_pair(start,1));
while(!ary.empty()){
pair<long, long> now = ary.front();
ary.pop_front();
//cout << now.first << now.second << "\n";
if (now.first == result) {
return now.second;
}
if (now.first * 2 <= result) {
ary.push_back(make_pair(now.first * 2, now.second + 1));
}
if (now.first * 10 + 1 <= result) {
ary.push_back(make_pair(now.first * 10 + 1, now.second + 1));
}
}
return -1;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> a >> b;
cout<<bfs(a,b);
return 0;
}