抓牛

#17. 抓牛

描述
提交
自定义测试

【题目描述】:

农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来.

他们都站在数轴上.约翰在N处,奶牛在K处.约翰有两种办法移动,步行和瞬移:步行每秒钟可以让约翰从x处走到x+l或x-l处;而瞬移则可让他在1秒内从x处消失,在2x处出现.然而那只逃逸的奶牛,悲剧地没有发现自己的处境多么糟糕,正站在那儿一动不动。

那么,约翰需要多少时间抓住那只牛呢?
【输入描述】:

仅有两个整数N和K。
【输出描述】:

最短时间
【样例输入】:

5 17

【样例输出】:

4

【时间限制、数据范围及描述】:

时间:1s 空间:128M

O<=N<=100000

O<=K<=100000

本题为BFS
但在循环中必须进行剪枝与判重
否则会超时

#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;

int n,m,k[100005][2];
int p,q,x,y;
bool b[100005];

int main()
{
	scanf("%d%d",&n,&m);
	if(n==m){printf("0\n");return 0;}
	if(n>m){printf("%d\n",n-m);return 0;}
	p=q=1;k[p][0]=n;k[p][1]=0;b[n]=1;
	while(p<=q){
		x=k[p][0];y=k[p][1];++p;
		if(2*x==m){printf("%d\n",y+1);break;}
		else if(b[2*x]==0 && 2*x<=100000){k[++q][0]=2*x;k[q][1]=y+1;b[2*x]=1;}
		if(x+1==m ){printf("%d\n",y+1);break;} 
		else if(b[x+1]==0 && x+1<=100000){k[++q][0]=x+1;k[q][1]=y+1;b[x+1]=1;}
		if(x-1==m){printf("%d\n",y+1);break;}
		else if(b[x-1]==0 && x-1>=0){k[++q][0]=x-1;k[q][1]=y+1;b[x-1]=1;}
	}
	return 0;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值