题目
分析
以前学的广度遍历都是基于二维的,这个是一维的,还觉得满新奇的!
代码和二维的差不多,就是需要注意下这里移动位置的操作容易超出数组的范围,因此采用了分类讨论,而不是常见的for循环
代码
#include<iostream>
#include<queue>
#define N 1000010
using namespace std;
int n,m;
int visit[N];
struct node{
int x,t;
};
node a,b;
void bfs(){
queue<node> Q;
a.x=n;b.x=m;
a.t=0;b.t=0;
visit[n]=1;
Q.push(a);
while(!Q.empty()) {
a=Q.front();
Q.pop();
if(a.x==m)
break;//因为这里的操作容易让数组下标超出数组范围,因此采用分类讨论
if(a.x-1>=0 and visit[a.x-1]==0){
b.x=a.x-1;
b.t=a.t+1;
visit[b.x]=1;
Q.push(b);
}
if(a.x+1<=100000 and visit[a.x+1]==0){
b.x=a.x+1;
b.t=a.t+1;
visit[b.x]=1;
Q.push(b);
}
if(a.x*2<=100000 and visit[a.x*2]==0){
b.x=a.x*2;
b.t=a.t+1;
visit[b.x]=1;
Q.push(b);
}
}
cout<<a.t<<endl;
}
int main(){
cin>>n>>m;
if(m<=n){
cout<<n-m<<endl;
return 0;
}
bfs();
}