题目
题目描述
花花经过长时间的研究,终于研发出了能够跃迁的宇宙飞船。现在,他想要前往致远星。假设地球和致远星都在一个坐标轴上,其中地球位于坐标n,而致远星位于坐标k。而花花的飞船支持以下两种运动方式:
1.飞行:在一个时间单位中,能够从坐标x移动到x-1或x+1;
2.跃迁:在一个时间单位中,能够直接从x跃迁到2x。
3.现在,花花想知道,他需要多长时间才能到达致远星?
输入描述
两个值,分别代表n和k。(0 ≤ n, k ≤ 100,000)
输出描述
输出花花最少需要的时间。
样例输入
5 17
样例输出
4
样例解释
花花的行走轨迹为:5-10-9-18-17
一维模板题简单粗暴上代码
上代码
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;
int n,k;
bool b[100010];//标记数组
int a[100010];//存时间
queue<int> q;
int bfs(int begin,int end){
int temp,t;
q.push(begin);
b[begin]=1;
while(!q.empty()){
temp=q.front();
q.pop();
for(int i=1;i<=3;i++){
if(i==1){
t=temp+1;
}
else if(i==2){
t=temp-1;
}
else if(i==3){
t=temp*2;
}
if(t<0||t>100000) continue;
if(b[t]==1) continue;
q.push(t);
b[t]=1;
a[t]=a[temp]+1;//时间
if(end==t){
return a[end];
}
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
while(cin>>n>>k){
for(int i=0;i<=100001;i++){
a[i]=0;
b[i]=0;
}
if(n>=k){
cout<<n-k<<endl;//只有一个x-1 往回走
}
else{
cout<<bfs(n,k)<<endl;
}
}
return 0;
}