Catch That Cow
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 97240 | Accepted: 30519 |
Description
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.
思路:bfs入门题,用到一些剪枝,之前没怎么用bfs不是很熟练,看了些其他大佬的代码,每个点都有三种情况,将三种情况入队,然后标记这个点已经访问,最后最先达到k点的必为最短。直接输出就行了
实现代码:
//#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<cmath> #include<algorithm> #include<map> #include<queue> #include<stack> #include<set> #include<list> using namespace std; #define me0(x) memset(x,0,sizeof(x)) #define pb(x) push_back(x) #define ll long long const int Mod = 1e9+7; const int inf = 1e9; const int Max = 2e5+10; vector<int>vt[Max]; queue<int>q; int dx[] = {-1, 1, 0, 0}; int dy[] = { 0, 0, -1, 1}; //void exgcd(ll a,ll b,ll& d,ll& x,ll& y){if(!b){d=a;x=1;y=0;}else{exgcd(b,a%b,d,y,x);y-=x*(a/b);}} //ll inv(ll a,ll n){ll d, x, y;exgcd(a,n,d,x,y);return (x+n)%n;} ??? //int gcd(int a,int b) { return (b>0)?gcd(b,a%b):a; } ??С??? //int lcm(int a, int b) { return a*b/gcd(a, b); } ??С???? int cnt[Max]; bool vis[Max]; void bfs(int l,int r) { q.push(l); vis[l] = 1; cnt[l] = 0; while(!q.empty()){ int x = q.front(); q.pop(); if(x==r){ cout<<cnt[r]<<endl; break; } if(x-1>=0&&!vis[x-1]){ vis[x-1] = 1; q.push(x-1); cnt[x-1] = cnt[x] + 1; } if(x<=r&&!vis[x+1]){ vis[x+1] = 1; q.push(x+1); cnt[x+1] = cnt[x] + 1; } if(x<=r&&!vis[x*2]){ vis[x*2] = 1; q.push(x*2); cnt[x*2] = cnt[x] + 1; } } } int main() { int n,m; cin>>n>>m; me0(vis); bfs(n,m); return 0; }