#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;
}