原题
题目描述
FJ丢失了他的一头牛,他决定追回他的牛。已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动。FJ的行走方式很特别:他每一次可以前进一步、后退一步或者直接走到2*x的位置。计算他至少需要几步追上他的牛。
输入输出格式
输入格式:
第一行为一个整数t(≤10),表示数据组数;接下来每行包含一个两个正整数x和y(0<x,y≤10^5),分别表示FJ和牛的坐标。
输出格式:
对于每组数据,输出最少步数。
输入输出样例
输入样例#1:
1
5 17
输出样例#1:
4
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int h[1000001][3];
int n,k,x;
bool v[1000001];
int main()
{
int m;
cin>>m;
for(int o=1;o<=m;o++)
{
cin>>n>>k;
memset(h,0,sizeof(h));
memset(v,0,sizeof(v));
h[1][1]=n;
v[n]=1;
int head=0,tail=1;
do
{
head++;
for(int i=1;i<=3;i++)
{
x=h[head][1];
if(i==1)
x++;
if(i==2)
x--;
if(i==3)
x*=2;
if(x>=0&&x<=100000)
if(!v[x]||h[x][2]>h[h[head][1]][2]+1)
{
tail++;
h[tail][1]=x;
v[x]=1;
h[x][2]=h[h[head][1]][2]+1;
}
}
}while(head<tail);
cout<<h[k][2]<<endl;
}
return 0;
}