农夫知道一头牛的位置,想要抓住它。
农夫和牛都位于数轴上,农夫起始位于点 N,牛位于点 K。
农夫有两种移动方式:
从 X 移动到 X−1 或 X+1,每次移动花费一分钟
从 X 移动到 2∗X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。
农夫最少要花多少时间才能抓住牛?
输入格式
共一行,包含两个整数N和K。
输出格式
输出一个整数,表示抓到牛所花费的最少时间。
数据范围
0≤N,K≤105
输入样例:
5 17
输出样例:
4
代码:
/*
题目讲述一共有3种移动情况且权重一致
从 X 移动到 X−1
从 X 移动到 X+1
从 X 移动到 2∗X
相当于X 与X - 1,X + 1,2 * X ,各连一条边,从n开始进行bfs到k,dist[k]表示k点到n点的最短距离
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int dist[N];
int bfs()
{
queue<int> qu;
memset(dist, -1, sizeof(dist));
dist[n] = 0;
qu.push(n);
while (qu.size())
{
int t = qu.front();
qu.pop();
if (t == m)
return dist[t];
if (t + 1 < N && dist[t + 1] == -1)
{
dist[t + 1] = dist[t] + 1;
qu.push(t + 1);
}
if (t - 1 >= 0 && dist[t - 1] == -1)
{
dist[t - 1] = dist[t] + 1;
qu.push(t - 1);
}
if (t * 2 < N && dist[t * 2] == -1)
{
dist[t * 2] = dist[t] + 1;
qu.push(t * 2);
}
}
return -1;
}
int main()
{
cin >> n >> m;
cout << bfs() << endl;
return 0;
}