第一次用(bfs),卡了我好几天(没错,你没有听错),才发现自己想象中的(bfs)与真实的(bfs)的差别
(bfs)是一层一层的,将每一层都入队,所以最外面的(while)循环判断条件是队列非空
每一个节点都可以作为父节点在队列后加几种可能性去搜索
需要判重
判重数组可以与存储答案的数组合并
最后输出(f_m)
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
queue<int> a;//队列
int flag[205005];//判重
int main()
{
memset(flag,-1,sizeof(flag));//初始化
int n,m;
cin>>n>>m;
if(n==m)//相等的情况
{
cout<<0;
return 0;
}
a.push(n);//压入初始点
flag[n]=0;//第0步
while(!a.empty())//非空
{
int temp=a.front();//取出队首
a.pop();
if(temp==m)
break;//到达即推出
if(temp*2<200005&&flag[temp*2]==-1)
a.push(temp*2),flag[temp*2]=flag[temp]+1;//判断边界与判断重复
if(temp+1<=m&&flag[temp+1]==-1)//一个剪枝与判断重复
a.push(temp+1),flag[temp+1]=flag[temp]+1;
if(temp-1>=0&&flag[temp-1]==-1)//边界与重复
a.push(temp-1),flag[temp-1]=flag[temp]+1;
}
cout<<flag[m];//输出答案
return 0;
}
注:此乃笔记