这题也可以算你咕最水的几道黄题之一了,做题的人大部分都是新手(或者是像我这样喜欢刷水题的人),我就讲的详细一点。
既然是求最少的步骤,那就肯定首选 BFS,但是题解里没有,那我就发一篇用 STL 的 queue 做的 BFS 吧。
本题的衍生状态只有两种,即 (n imes2) 和 (n imes3),直接爆搜就可以过。如果 (n) 已经超过了 (m),就剪枝,非常好理解。
if(now.num*2<=m) //剪枝,当 n>m 时就没必要继续搜了。
{
node nex;
nex.num=now.num*2; //num 代表此时的数字。
nex.sum=now.sum+1; //sum 用来存储所用的步数。
q.push(nex); //入队
}
if(now.num*3<=m) //同上
{
node nex;
nex.num=now.num*3;
nex.sum=now.sum+1;
q.push(nex);
}
当 (n=m) 时,根据 BFS 的特性,所需的步骤肯定是最少的,不用像 DFS 一样把所有情况都搜完。此时就可以直接输出,结束程序。
if(now.num==m)
{
cout<<now.sum;
exit(0); //exit(0) 和 return 的区别是:return 只能终止当前的函数,exit(0)可以终止整个程序。
}
当 BFS 的函数结束之后程序还在运行,那么就说明无解,输出 -1
。
总之,这题是一道极其入门的搜索题,思路简单明了,适合刚学习搜索的小白练手,也可以供各位神犇练习手速。
上可爱的完整代码:
#include<bits/stdc++.h>
using namespace std;
struct node //使用结构体。
{
int num,sum;
}first;
queue<node> q; //我爱 STL。
int n,m;
inline void bfs() //inline 是为了加速。
{
while(q.empty()==0)
{
node now=q.front();
q.pop();
if(now.num==m)
{
cout<<now.sum;
exit(0);
}
if(now.num*2<=m)
{
node nex;
nex.num=now.num*2;
nex.sum=now.sum+1;
q.push(nex);
}
if(now.num*3<=m)
{
node nex;
nex.num=now.num*3;
nex.sum=now.sum+1;
q.push(nex);
}
}
}
int main()
{
cin>>n>>m;
if(n>m)
{
cout<<-1;
return 0;
}
first.num=n;
first.sum=0;
q.push(first);
bfs();
cout<<-1;
return 0;
}
逃(