农夫知道一头牛的位置,想要抓住它。
农夫和牛都位于数轴上,农夫起始位于点 N,牛位于点 K。
农夫有两种移动方式:从 X 移动到 X−1 或 X+1,每次移动花费一分钟从 X 移动到 2∗X,每次移动花费一分钟。
假设牛没有意识到农夫的行动,站在原地不动。
农夫最少要花多少时间才能抓住牛?
输入格式
共一行,包含两个整数N和K。
输出格式
输出一个整数,表示抓到牛所花费的最少时间。
数据范围
0≤N,K≤105
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
- typedef pair<int,int> PII;
- const int N=2e6+10;
- int d[N];
- bool vis[N];
- int n,k;
- queue <int> q;
- int bfs(int n)
- {
- vis[n]=1;
- q.push(n);
- while (q.size()&&!vis[k])
- {
- int x=q.front();
- q.pop();
- if (!vis[x-1]&&x-1>=0)
- {
- d[x-1]=d[x]+1;
- q.push(x-1);
- vis[x-1]=1;
- }
- if (!vis[x+1]&&x+1<=2e5)
- {
- d[x+1]=d[x]+1;
- q.push(x+1);
- vis[x+1]=1;
- }
- if (!vis[2*x]&&2*x<=2e5)
- {
- d[2*x]=d[x]+1;
- q.push(2*x);
- vis[2*x]=1;
- }
- }
- return d[k];
- }
- signed main()
- {
- ios;
- cin>>n>>k;
- cout<<bfs(n);
- return 0;
- }