您的位置:首页 > 其它

抓住那头牛

2014-11-13 20:21 204 查看
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:

1、从X移动到X-1或X+1,每次移动花费一分钟

2、从X移动到2*X,每次移动花费一分钟

假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?

输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数

样例输入

5 17

样例输出

4

每一个位置都有三种方式可以走即退一步(-1),进一步(+1),跳着走(*2),而不论走的是哪一种,走到下一步又同样会有三种方式,因此从第一步起将每一种可能(即走到的位置)存到队列里,利用队列先进先出的特性遍历每一种可能,一找到“牛”就停止说明所用时间最少。

#include<stdio.h>
#include<stdlib.h>
#define M 100001
typedef struct
{
int num[M];
int front;
int rear;
int size;
}queue;
void add(queue *p,int item)
{
p->rear=(p->rear+1)%M;
p->num[p->rear]=item;
p->size++;
}
int dele(queue *p)
{
p->front = (p->front+1)%M;
p->size--;
return p->num[p->front];
}
int main()
{
queue *p;
int n,k,s[M]={0},m=0;
scanf("%d %d",&n,&k);
if(k<n)
printf("%d\n",n-k);//当k<n时只能拿来减
else
{
p=(queue*)malloc(sizeof(queue));
p->front=p->rear=p->size=0;
add(p,n);
while(1)
{
m=dele(p);
if(m==k)
break;
if(m>0 && s[m-1]==0)//s[m-1]==0表示不能重复走过的路
{
add(p,m-1);
s[m-1]=s[m]+1;
}
if(s[m+1]==0)
{
add(p,m+1);
s[m+1]=s[m]+1;
}
if(2*m<M && s[2*m]==0)//m>0.2*m<M表示不能越界,否则会错误
{
add(p,2*m);
s[2*m]=s[m]+1;
}
}
printf("%d\n",s[m]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: