Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 64397 | Accepted: 20226 |
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
Output
Sample Input
5 17
Sample Output
4
Hint
Source
#include <cstdio> #include <cstdlib> #include <cstring> #include <queue> using namespace std; bool vis[200001]; typedef struct { int data,step; }position; position father,current; queue<position> bus; int vplus,vreduce,vadd; int main(void) { int n,k; scanf("%d %d",&n,&k); if(n==k) { printf("0\n"); return 0; } if(n>k) { printf("%d\n",n-k); return 0; } current.step=0; current.data=n; bus.push(current); while(!bus.empty()) { father=bus.front(); bus.pop(); if(father.data==k) { printf("%d\n",father.step); return 0; } vis[father.data]=true; vplus=father.data+father.data; vreduce=father.data-1; vadd=father.data+1; current.step=father.step+1; if(vplus<200001&&!vis[vplus]) { current.data=vplus; bus.push(current); } if(vadd<200001&&!vis[vadd]) { current.data=vadd; bus.push(current); } if(vreduce>-1&&!vis[vreduce]) { current.data=vreduce; bus.push(current); } } return (0); }
#include<iostream> #include<queue> using namespace std; #define M 100001 #define INF 10000000 struct POINT { int pos; int step; }now,next; queue<POINT>Q; bool visited[M]; int n,k; int bfs() { while(!Q.empty()) Q.pop(); now.pos=n; now.step=0; visited[now.pos]=true; Q.push(now); while(!Q.empty()) { now=Q.front(); Q.pop(); next=now; for(int i=0;i<3;i++) { if(i==0) next.pos=now.pos+1; if(i==1) next.pos=now.pos-1; if(i==2) next.pos=now.pos*2; next.step=now.step+1; if(next.pos==k) return next.step; if(next.pos<0||next.pos>M) continue; if(!visited[next.pos]) { visited[next.pos]=true; Q.push(next); } } } return INF; } int main() { while(cin>>n>>k) { memset(visited,false,sizeof(visited)); if(n<k) cout<<bfs()<<endl; if(n==k) cout<<0<<endl; if(n>k) cout<<n-k<<endl; } }