Catch That Cow

来源:互联网 发布:spss软件如何下载 编辑:程序博客网 时间:2024/06/05 09:36
Catch That Cow
Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 75017 Accepted: 23685

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 - 1 or + 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<stdio.h>  #include<string.h>  #include<queue>  #include<algorithm>  using namespace std;  int step[100010];  int n,m;  void bfs(int n,int m)  {      memset(step,0,sizeof(step));      queue<int>q;      q.push(n);      while(!q.empty())      {          int now=q.front();          q.pop();          if(now==m)            break;          for(int i=0;i<3;i++)          {              int next;              if(i==0)                next=now+1;              if(i==1)                 next=now-1;              if(i==2)                next=now*2;              if(next>=0&&next<=100000&&!step[next])              {                  step[next]=step[now]+1;                  q.push(next);              }          }      }  }  int main()  {      while(scanf("%d%d",&n,&m)!=EOF)      {          bfs(n,m);          printf("%d\n",step[m]);      }      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;      }  }  



0 0
原创粉丝点击