1701: 抓住那头牛

题目描述:

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟

假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?

输入:

两个整数,N和K

输出:

一个整数,农夫抓到牛所要花费的最小分钟数

样例输入:

5 7

样例输出:

4



思路:

相信很多人(包括我这只蒟蒻)看到这道题的时候都很懵,不知道该从何处下手。其实这是一道BFS题(似乎还有其它做法)

BFS???!!该怎么做???

其实我们可以把它看作一个图来做,举个栗子:
image

(此图很重要)

  • [First] :在1这个点,我们可以去到1+1 和 1-1(图中不存在)和 1*2这三个点,那么就将1将这几个值都连上(实际上只连了一个2)

  • [Second] :再来看2这个点,它可以去到2+1 和 2-1(已经连上了) 和 2*2三个点,那么又将2与这几个点相连

  • [Third] : 接下来就是3这个点了,它可以到3+1 和 3-1(已经连上了) 和 3*2三个点,那么双将3与这几个点相连

——————· · · · · · · · · · · · · · · · · · · · · · · ·(以此类推)——————

就可以得到上面这个图。

那么现在问,从1到5最近怎么走(怎么感觉像最短路问题)

答案就是1 -> 2 -> 4 -> 5.

此题大致就是这么个意思


那么废话不多说,咱们回归正题。

我们可以用一个dis[]数组来装从n到其点的距离。

进入BFS函数,先设定一个队列(先进先出,先遍历到的,先进入BFS),将dis[n]设为1(其实应该为0,但为了后面的计算方便就为1,最后输出的时候-1即可)

接下来为防止数组越界就要判断x是不是负下标,或超出数组范围,如果是就要continue.(在这里一定要提醒一下,这个判断只防住了x+1 和 x-1 时的数组越界,但是当x卡在边缘时,x*2时也会越界,但这个怎么处理呢,就要把数组开到数据范围的2倍我就是在这个点卡了好久

现在就是遍历x+1 、x-1 与 x2三个点了。如果这个点还没有被访问过(即x+1/-1/2 == 0,因为没被走过,它就不会有任何标记
就标记一下,增加距离,在现在dis[x]的基础上+1即可,再将其放入队列中等待BFS就可以了。

话不多说,上代码

代码:

#include <bits/stdc++.h>
using namespace std;
  
int n, k, dis[200005];//dis数组一定要定义到200005,不然遍历x*2时可能要越界 
queue<int> que;//建立队列 
 
void bfs(){
    que.push(n);//放入初始位置(农夫位置) 
    dis[n] = 1;//为了计算方便,赋值为1,后面输出时要-1 
    while(que.size()){
        int x = que.front();//取出队首元素,进行遍历 
        que.pop();//删除队首 
        if(x < 0 || x > 100000) continue;
        //如果其为负且大于数据范围,直接跳过 
        if(dis[x + 1] == 0){//没被访问过 
            dis[x + 1] = dis[x] + 1;//标记与起始点的距离 
            que.push(x + 1); //将其放入队列 
        }
        if(dis[x - 1] == 0){//没被访问过 
            dis[x - 1] = dis[x] + 1;//标记与起始点的距离 
            que.push(x - 1); //将其放入队列 
        }
        if(dis[x * 2] == 0){//没被访问过 
            dis[x * 2] = dis[x] + 1;//标记与起始点的距离
            que.push(x * 2); //将其放入队列 
        }
    }
}
int main()
{
    cin >> n >> k; //输入 
    bfs();//进入BFS 
    printf("%d\n", dis[k] - 1);//因为BFS时,把dis[n]设为的时1,本该为0,所以要-1 
    return 0;
}
posted @ 2022-03-26 23:41  XDFZ武斌  阅读(364)  评论(1)    收藏  举报