[USACO2007OPEN S] Catch That Cow S

这篇博客介绍了一种解决追牛问题的方法,即FJ如何通过特定的行走方式追上固定位置的牛。代码实现中采用了广度优先搜索(BFS)算法,从FJ的初始位置开始,考虑前进、后退和跳跃到2倍位置的操作,直到找到追上牛的最短步数。博客内容涉及到算法设计和优化,适合对算法感兴趣的读者阅读。
摘要由CSDN通过智能技术生成

题目描述

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值