这道题是道典型的宽搜问题,我们可以从它的数据量就可以看出深搜要超时,并且最短路要用宽搜。
#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]){//边界条件是0d[p-1]=d[p]+1;sm.push(p-1);}if(p<n&&d[p]+1<d[p+1]){//若小于n才能+1d[p+1]=d[p]+1;sm.push(p+1);}if(p<100001&&d[p]+1<d[2*p]){//小于n才能乘2d[p*2]=d[p]+1;sm.push(p*2);}}return d[end];}int main(){
cin>>start>>end;cout<<search();}