农夫知道一头牛的位置

农夫知道一头牛的位置,想要抓住它。农夫和牛都于数轴上 ,农夫起始位于点 N(0<=N<=100000) ,牛位于点 K(0<=K<=100000) 。农夫有两种移动方式: 1、从 X移动到 X-1或X+1 ,每次移动花费一分钟 2、从 X移动到 2*X ,每次移动花费一分钟 假设牛没有意识到农夫的行动,站在原地不动。最少要花多少时间才能抓住牛?
Input
一行: 以空格分隔的两个字母: N 和 K
Output
一行: 农夫抓住牛需要的最少时间,单位分钟
Sample Input
5 17
Sample Output
4
Hint
农夫使用最短时间抓住牛的方案如下: 5-10-9-18-17, 需要4分钟

通常使用队列
初始化队列m
q=[起点a];标记a为已访问点;
while(q非空)
{ 取q队首元素b;
b 出队;
if(b==目标)break;
{…}
所有与b相邻且被访问的点进入队列;
标记b为已访问
}

#include
#include
#include
using namespace std;
queue h;//定义h这个队列
int m,n,i[100001];
int main()
{
memset(i,0x3f,sizeof(i));
scanf("%d %d",&n,&m);
h.push(n);
i[n]=0;
while (h.size())
{
int t=h.front();
h.pop();
if (t==m)
break;
if (t<100000&&i[t+1]>i[t]+1)
{
i[t+1]=i[t]+1;
h.push(t+1);
}
if (t>1&&i[t-1]>i[t]+1)
{
i[t-1]=i[t]+1;
h.push(t-1);
}
if ((t<<1)<=100000&&i[t<<1]>i[t]+1)
{
i[t<<1]=i[t]+1;
h.push(t<<1);
}
}
printf("%d",i[m]);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值