题目大意:
给你两个数,N,K;问你从N到K至少需要几步。变换方法有三种n+1,n-1,2*n;
#include<iostream>
#include<math.h>
#include<queue>
#include<stdio.h>
#include<string.h>
#define N 100500
using namespace std;
bool vis[N]={0};
int dis[N]={0};
int n,m;
int move(int x,int y)
{
if(y==0)return x-1;
if(y==1)return x+1;
else return 2*x;
}
int main()
{
while(cin>>n>>m)
{
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
if(n>=m)
{
cout<<n-m<<endl;
continue;
}
queue<int>q;
q.push(n);
bool flag=0;
while(!q.empty())
{
if(flag==1)break;
for(int i=0;i<3;i++)
{
int t;
t=move(q.front(),i);
if(t==m)
{
dis[t]=dis[q.front()]+1;
flag=1;
break;
}
if(vis[t]==1||t<0||t>100000)continue;
dis[t]=dis[q.front()]+1;
vis[t]=1;
q.push(t);
}
q.pop();
}
cout<<dis[m]<<endl;
}
}