题目大意:

给你两个数,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;
	}
}