题目描述
FJ 丢失了他的一头牛,他决定追回他的牛。已知 FJ 和牛在一条直线上,初始位置分别为 x 和 y,假定牛在原地不动。FJ 的行走方式很特别:他每一次可以前进一步、后退一步或者直接走到 2×x 的位置。计算他至少需要几步追上他的牛。
输入格式
第一行为一个整数 t (1≤t≤10),表示数据组数;
接下来每行包含一个两个正整数 x,y (0<x,y≤105),分别表示 FJ 和牛的坐标。
输出格式
对于每组数据,输出最少步数。
输入输出样例
输入 #1
1 5 17
输出 #1
4
代码如下:
#include<bits/stdc++.h>
using namespace std;
int fun(int n,int m){
int dl[100001][2]={},zt[100001]={};
int xx[3]={-1,1,0},yy[3]={1,1,2};
dl[1][0]=n;
dl[1][1]=0;
for(int begin=1,end=1;begin<=end;begin++){
int x=dl[begin][0];
if(x==m){
return dl[begin][1];
}
for(int k=0;k<3;k++){
if(x>m&&k>0){
continue;
}
int tx=(x+xx[k])*yy[k];
if(zt[tx]==0){
end++;
zt[tx]=1;
dl[end][0]=tx;
dl[end][1]=dl[begin][1]+1;
}
}
}
}
int main(){
int xx;
cin>>xx;
while(xx--){
int n,m;
cin>>n>>m;
cout<<fun(n,m)<<endl;
}
return 0;
}