题目描述
小Q从牛博士那里获得了一个数字转换机,这台数字转换机必须同时输入两个正数a和b,并且这台数字转换机有一个红色的按钮和一个蓝色的按钮:
当按下了红色按钮,两个数字同时加1。
当按下了蓝色按钮,两个数字同时乘2。
小Q现在手中有四个整数a,b,A,B,他希望将输入的两个整数a和b变成A,B(a对应A,b对应B)。因为牛博士允许小Q使用数字转换机的时间有限,所以小Q希望按动按钮的次数越少越好。请你帮帮小Q吧。
输入描述:
输入包括一行,一行中有四个正整数a,b,A,B,(1≤a,b,A,B≤10^9)。
输出描述:
如果小Q可以完成转换,输出最少需要按动按钮的次数,否则输出-1。
示例1
输入
100 1000 202 2002
输出
2
递归(深度搜索)
#include<iostream>
#include<algorithm>
using namespace std;
int ans = -1;
void solve(int a, int b, int A, int B, int cnt)
{
if(a >= A || b >= B)
{
if(a == A && b == B)
{
if(ans == -1)
ans = cnt;
else
ans = min(ans, cnt);
}
return ;
}
for(int i = 0; i < 2; ++i)
{
if(i == 0)
solve(a + 1, b + 1, A, B, cnt+1);
else
solve(a * 2, b * 2, A, B, cnt+1);
}
return ;
}
int main()
{
int a,b,A,B;
cin >> a >> b >> A >> B;
solve(a, b, A, B, 0);
cout << ans << endl;
return 0;
}