I - Catch That Cow HDU - 2717 (bfs入门)

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
HintThe 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.

分析:       

题意:一条线上,人的FJ的起点为K位置,牛在N位置(牛不动),输入正整数K和N。若FJ在x位置,FJ有三种走法,分别是走到x-1、x+1或2x位置。求从K走到N的最少步数 。

 很简单的一道bfs搜索题,只不过把常见的二维地图换成了一维的,循环换成三种走法。

这道题作为我广搜入门题,让我会用了stl,懂得了广搜的套路。nice

ac代码:

#include<iostream>  
#include<queue>  
#include<cstring>  
#include<cstdio>  
using namespace std;  
  
const int maxn=100001;  
  
bool book[maxn];//标记数组  
int step[maxn];//记录到了每一位置所走的步数  
queue <int> q;//定义队列  
  
int bfs(int n,int k)  
{  
    int head,next;  
    q.push(n);   //开始FJ在n位置,n入队  
    step[n]=0;  
    book[n]=true; //标记已访问  
    while(!q.empty())  //当队列非空  
    {  
        head=q.front();  //取队首  
        q.pop();         //弹出对首  
        for(int i=0;i<3;i++)     //FJ的三种走法  
        {  
            if(i==0) next=head-1;  
            else if(i==1) next=head+1;  
            else next=head*2;  
            if(next<0 || next>=maxn) continue; //排除出界情况  
            if(!book[next])  //如果next位置未被访问  
            {  
                q.push(next);    //入队  
                step[next]=step[head]+1;  //步数+1  
                book[next]=true;  //标记已访问  
            }  
            if(next==k) return step[next];  //当遍历到结果,返回步数  
        }  
    }  
}  
int main()  
{  
    int n,k;  
    while(cin>>n>>k)  
    {  
        memset(step,0,sizeof(step));  
        memset(book,false,sizeof(book));  
          
        while(!q.empty()) q.pop(); //注意调用前要先清空  
        if(n>=k) printf("%d\n",n-k);  
        else printf("%d\n",bfs(n,k));  
    }  
    return 0;  
}  

 

猜你喜欢

转载自blog.csdn.net/qq_42079027/article/details/81488611