[USACO2007OPEN S] Catch That Cow S
题目描述
FJ丢失了他的一头牛,他决定追回他的牛。已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动。FJ的行走方式很特别:他每一次可以前进一步、后退一步或者直接走到2*x的位置。计算他至少需要几步追上他的牛。
输入格式
第一行为一个整数t(≤10),表示数据组数;接下来每行包含一个两个正整数x和y(0<x,y≤10^5),分别表示FJ和牛的坐标。
输出格式
对于每组数据,输出最少步数。
样例 #1
样例输入 #1
1
5 17
样例输出 #1
4
考虑广搜,枚举x可以走的每一步,什么时候到了y就输出答案。可以用时间戳记录是否用过没。
#include<bits/stdc++.h>
const int N=1e6+5;
int t,x,y,q[N],p[N],v[N],l,r;
int main()
{
scanf("%d",&t);
memset(v,-1,sizeof(v));
while(t--)
{
scanf("%d%d",&x,&y);
q[l=r=1]=x,v[x]=t,p[1]=0;
while(l<=r)
{
if(q[l]==y)
{
printf("%d\n",p[l]);
break;
}
if(q[l]*2<N&&v[q[l]*2]!=t)
q[++r]=q[l]*2,p[r]=p[l]+1,v[q[l]*2]=t;
if(q[l]+1<N&&v[q[l]+1]!=t)
q[++r]=q[l]+1,v[q[l]+1]=t,p[r]=p[l]+1;
if(q[l]&&v[q[l]-1]!=t)
q[++r]=q[l]-1,v[q[l]-1]=t,p[r]=p[l]+1;
++l;
}
}
return 0;
}