这道题是道典型的宽搜问题,我们可以从它的数据量就可以看出深搜要超时,并且最短路要用宽搜。
#include<iostream>
#include<queue>
using namespace std;
queue<int>sm;//宽搜用队列
int d[200001]={0},start,end;//d[]代表走到当前点需要的最少步数
int search (){
sm.push(start);
for(int i=0;i<=200000;i++)d[i]=1001110;//初始化
d[start]=0;
while(sm.size()){
int p=sm.front();sm.pop();
if(p==end)break;
if((p-1)>=0&&d[p]+1<d[p-1]){//边界条件是0
d[p-1]=d[p]+1;
sm.push(p-1);
}
if(p<n&&d[p]+1<d[p+1]){//若小于n才能+1
d[p+1]=d[p]+1;
sm.push(p+1);
}
if(p<100001&&d[p]+1<d[2*p]){//小于n才能乘2
d[p*2]=d[p]+1;
sm.push(p*2);
}
}
return d[end];
}
int main(){
cin>>start>>end;
cout<<search();
}