描述
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
从X移动到X-1或X+1,每次移动花费一分钟
从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
5 17
样例输出
4
BFS
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
typedef struct
{
int loc;
int tm;
}NODE;
int vis[100010];
int main()
{
queue<NODE> q;
int n,k;
NODE x,y;
cin>>n>>k;
x.loc=n;
x.tm=0;
q.push(x);
while(!q.empty())
{
x=q.front();
if(x.loc==k)
{
cout<<x.tm<<endl;
break;
}
if(x.loc>=0&&x.loc<=100000)
{
if(vis[x.loc-1]==0)
{
y.loc=x.loc-1;
y.tm=x.tm+1;
q.push(y);
vis[y.loc]=1;
}
if(vis[x.loc+1]==0)
{
y.loc=x.loc+1;
y.tm=x.tm+1;
q.push(y);
vis[y.loc]=1;
}
if(vis[x.loc*2]==0)
{
y.loc=x.loc*2;
y.tm=x.tm+1;
q.push(y);
vis[y.loc]=1;
}
}
q.pop();
}
}