Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.
* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.
If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
Input
Line 1: Two space-separated integers: N and K
Output
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input
5 17
Sample Output
4
Hint
The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.
这道题是关于最短步数的,首先就要想到广搜,既然想到了广搜就可以写代码了。
#include<iostream> #include<queue> #include<algorithm> #include<set> #include<cmath> #include<vector> #include<map> #include<stack> #include<bitset> #define Swap(a,b) a^=b^=a^=b #define cini(n) scanf("%d",&n) #define cinl(n) scanf("%lld",&n) #define cinc(n) scanf("%c",&n) #define coui(n) printf("%d",n) #define couc(n) printf("%c",n) #define coul(n) printf("%lld",n) #define speed ios_base::sync_with_stdio(0);//Çв»¿ÉÓÃscnaf£» #define Max(a,b) a>b?a:b #define Min(a,b) a<b?a:b using namespace std; typedef long long ll; const int INF=0x3f3f3f3f; const int maxn=1e6+10; const double esp=1e-9; int m,n,x,y; int cnt,mini=INF; bool flag[maxn]; int bfs(int x); int main() { cin>>m>>n; cout<<bfs(m)<<endl; } int bfs(int x) { queue<pair<int,int> > t; t.push(make_pair(x,0)); while(!t.empty()) { pair<int,int>w=t.front(); if(w.first==n)break; t.pop(); w.first++,w.second++; if(w.first<0||w.first>100000||flag[w.first]); else t.push(w),flag[w.first]=1; w.first-=2; if(w.first<0||w.first>100000||flag[w.first]); else t.push(w),flag[w.first]=1; w.first++; w.first*=2; if(w.first<0||w.first>100000||flag[w.first]); else t.push(w),flag[w.first]=1; } return t.front().second; }