[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;
}
posted @ 2022-06-02 17:28  灰鲭鲨  阅读(58)  评论(0编辑  收藏  举报