题目描述:
农夫知道一头牛的位置,想要抓住它。
农夫和牛都位于数轴上,农夫起始位于点 N,牛位于点 K。
农夫有两种移动方式:
从 X 移动到 X−1 或 X+1,每次移动花费一分钟
从 X 移动到 2∗X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。
农夫最少要花多少时间才能抓住牛?
输入格式
共一行,包含两个整数N和K。
输出格式
输出一个整数,表示抓到牛所花费的最少时间。
数据范围
0≤N,K≤105
输入样例:
5 17
输出样例:
4
代码:
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int, int>PII;
queue<int>q;
int N = 1e5+10;
int mp[1000010];
void BFS(int s,int e)
{
memset(mp, -1, sizeof mp);
mp[s] = 0;
q.push(s);
while (!q.empty())
{
int t = q.front();
if (t == e)
{
cout << mp[e] << endl;
return;
}
q.pop();
if (mp[2 * t] == -1 && 2 * t <= N)
{
mp[2 * t] = mp[t] + 1;
q.push(2 * t);
}
if (mp[t + 1] == -1 && t+1<=N)
{
mp[t + 1] = mp[t] + 1;
q.push(t + 1);
}
if (mp[t - 1] == -1 && t-1>=0)
{
mp[t - 1] = mp[t] + 1;
q.push(t - 1);
}
}
}
int main()
{
int a, b;
cin >> a >> b;
BFS(a, b);
}