题目描述
东东在玩游戏“Game23”。
在一开始他有一个数字n,他的目标是把它转换成m,在每一步操作中,他可以将n乘以2或乘以3,他可以进行任意次操作。输出将n转换成m的操作次数,如果转换不了输出-1。
Input
输入的唯一一行包括两个整数n和m(1<=n<=m<=5*10^8).
Output
输出从n转换到m的操作次数,否则输出-1.
Simple Input 1
120 51840
Simple Output 1
7
Simple Input 2
42 42
Simple Output 2
0
Simple Input 3
48 72
Simple Output 3
-1
解题思路
此题稍微仔细分析,还是比较简单的,尤其是如果从n开始往上乘,不需要进行记忆化处理来剪枝,只需要一次次递归即可,同时记录递归深度即为操作次数,直到乘积结果为所给值(结束条件)。但是也有找不到结果的情况,这个时候若递归函数重新回到第一次递归的深度,则说明没有找到结果。
代码
#include<iostream>
using namespace std;
int n,m;
bool mfind=false;
void solve(int p,int w)
{
if(mfind) return;
if(w>m) return ;
if(w==m)
{
cout<<p<<endl;
mfind=true;
return;
}
solve(p+1,2*w);
solve(p+1,3*w);
if(!p && !mfind) cout<<-1<<endl;
}
int main()
{
cin>>n>>m;
solve(0,n);
return 0;
}