Catch That Cow(BFS)

Think:
BFS +队列 题目, 农夫有两种种不同的移动方式

Problem 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.
Example Input

5 17

Example Output

4

题目大意:
1. 数轴上有A  B2点
2. 农夫 有两种移动方式:walk 每分钟移动一格
            Teleporting 每次移动 2*i个单位
3.求最短时间

#include<bits/stdc++.h>

 using namespace std;

 bool v[1000005];
 int step[1000005];

 void BFS(int n, int k);
 queue<int>q;

 int main()
  {
   int n, k;
   while(cin >> n >> k)
   {
   while(!q.empty())
     q.pop();
   memset(v, 0, sizeof(v));
   if (n >= k)
      cout << n - k << endl;
      else
   BFS(n, k);
   }
   return 0;
  }

  void BFS(int n, int k)
   {
      int head, next, i;
      q.push(n);
      step[n] = 0;
      while(!q.empty())
        {
            head = q.front();
            q.pop();
            for (i = 0;i < 3;i ++)
               {
                 if (i == 0)
                 next = head + 1;
                 if (i == 1)
                next = head - 1;
                if (i == 2)
                 next = head * 2;
                 if (next < 0 || next > 100000)
                  continue ;
                 if (v[next] == 0)
                    {
                     q.push(next);
                     step[next] = step[head] + 1;
                     v[next] = 1;
                    }
                    if (next == k)
                    {
                       cout << step[next] << endl;
                       return ;
                       }

               }
           }

          }



/***************************************************
User name: 
Result: Accepted
Take time: 0ms
Take Memory: 468KB
Submit time: 2017-02-18 19:26:43
****************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值