這道題是道典型的寬搜問題,我們可以從它的數據量就可以看出深搜要超時,並且最短路要用寬搜。
#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();
}