文章标题 Catch That Cow

来源:互联网 发布:全国人口数据库 编辑:程序博客网 时间:2024/05/17 08:45

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.

从N到M最少几步;
两种走法:
(1)当前数加1或者减1;
(2)当前数*2;

#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;int N,M;int b[200009];struct node{    int x,ans;};int bfs(int x,int ans){    node xy,xz;    xy.x=x,xy.ans=ans;    queue<node>s;    s.push(xy);    while(!s.empty())    {        xy=s.front();        s.pop();        if(xy.x==M)        {            return xy.ans;        }        for(int i=1;i<=3;i++)        {            if(i==1)            {                int xi=xy.x-1;                if(!b[xi]&&xi>=0&&xi<=100000)                {                    b[xi]=1;                    xz.x=xi,xz.ans=xy.ans+1;                    s.push(xz);                }            }            if(i==2)            {                int xi=xy.x+1;                if(!b[xi]&&xi>=0&&xi<=100000)                {                    b[xi]=1;                    xz.x=xi,xz.ans=xy.ans+1;                    s.push(xz);                }            }            if(i==3)            {                int xi=xy.x*2;                if(!b[xi]&&xi>=0&&xi<=100000)                {                    b[xi]=1;                    xz.x=xi,xz.ans=xy.ans+1;                    s.push(xz);                }            }        }    }    return 0;}int main(){    while(~scanf("%d%d",&N,&M))    {        memset(b,0,sizeof(b));        int step=bfs(N,0);        printf("%d\n",step);    }    return 0;}
0 0
原创粉丝点击