抓住那头牛
描述:
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入:
两个整数,N和K
输出:
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入:
5 17复制
样例输出:
4
只建book数组类
AC代码
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int book[200000];
int n,k;
struct node{
int x; // 代表位置
int step; // 代表步数
};
node now,ne,start; // 当前位置,下一个位置,起点
void bfs() // 广搜一层一层遍历,所以搜索中到达终点所用的时间就是最短时间
{
queue<node> q;
q.push(start);
while(q.size())
{
now=q.front();
q.pop();
if(now.x==k){
cout<<now.step;
return ;
}
for(int i=0;i<3;i++)
{
if(i==0) ne.x=now.x+1;
if(i==1) ne.x=now.x-1;
if(i==2) ne.x=now.x*2;
ne.step=now.step+1;
if(book[ne.x]==0&&ne.x>=0&&ne.x<=100000)
{
q.push(ne);
book[ne.x]=1;
}
}
}
}
int main()
{
cin>>n>>k;
memset(book,0,sizeof(book));
book[n]=1;
start.x=n; // 开始结点的位置为n;
start.step=0; // 开始结点的步数为0;
bfs();
return 0;
}