3060 抓住那头奶牛 USACO

时间:2021-08-23 10:17:08

3060 抓住那头奶牛

USACO

时间限制: 1 s
空间限制: 16000 KB
题目等级 : 黄金 Gold
题目描述 Description

农夫约翰被告知一头逃跑奶牛的位置,想要立即抓住它,他开始在数轴的N 点(0≤N≤100000),奶牛在同一个数轴的K 点(0≤K≤100000)。约翰有两种移动方式:1 分钟内从x 点移动到x+1 或x-1;1 分钟内从x 点移动到2x。假设奶牛不会移动,约翰抓住它需要多少时间?

输入描述 Input Description

一行两个整数N 和K,用空格隔开。

输出描述 Output Description

约翰抓住它需要的最少时间。

样例输入 Sample Input

5 17

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

见题目

思路:广搜。

 #include<iostream>
using namespace std;
#include<queue>
struct node{
int x,step;
}cur,net;
queue<node>s;
bool num[];
int n,m;
void bfs()
{
cur.x=n;
cur.step=;
s.push(cur);
num[n]=;
while(!s.empty() )
{
cur=s.front() ;
s.pop() ;
int a=cur.x;
if(a*>&&a*<=&&!num[a*]&&a<=m)
{
if(a*==m)
{
cout<<cur.step+;
return ;
}
net.x =a*;
net.step=cur.step +;
s.push(net);;
num[a*]=;
}
if(a+>&&a+<=&&!num[a+])
{
if(a+==m)
{
cout<<cur.step +;
return ;
}
net.x =a+;
net.step=cur.step +;
s.push(net);
num[a+]=;
}
if(a->&&a-<=&&!num[a-])
{
if(a-==m)
{
cout<<cur.step +;
return ;
}
net.x =a-;
net.step=cur.step +;
s.push(net);;
num[a-]=;
}
}
}
int main()
{
cin>>n>>m;
if(n>=m)
{
cout<<n-m;
return ;
}
bfs();
return ;
}