一千题,No.0019(抓住那头牛)

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:

1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟

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

输入格式:

两个整数,N和K

输出格式:

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

输入样例:

在这里给出一组输入。例如:

5 17

输出样例:

在这里给出相应的输出。例如:

4

 解题思路:

直接bfs解决;

1,起点入队

2,将起点可走的循环入队

3,头出队

4,循环2,3直到对为空,并判断出最小步数

c++代码如下:

#include <bits/stdc++.h>

#define elemtype int
using namespace std;

struct point
{
    point(int a,int b)
    :_x(a)
    ,_step(b)
    {

    }
    int _x;
    int _step;
};

elemtype arrA[9999999];
deque<point> d;
int min = 9999999;
int cow,man;

void BFS(deque<point> d)
{
    while(!d.empty())
    {
        int x = d.begin()->_x;
        int step = d.begin()->_step;

        if(x == cow)
        {
            if(step < ::min)
            {
                ::min = step;
            }
        }

        //x+1
        if(arrA[x+1] == 0 && x+1 <= cow*2)
        {
            d.push_back(point(x+1,step+1));
            arrA[x+1] = 1;
        }
        //x-1
        if(arrA[x-1] == 0 && x-1 >= 0)
        {
            d.push_back(point(x-1,step+1));
            arrA[x-1] = 1;
        }
        //2*x
        if(arrA[x*2] == 0 && x*2 <= cow*2)
        {
            d.push_back(point(x*2,step+1));
            arrA[x+1] = 1;
        }

        d.erase(d.begin());
    }
};

int main()
{
    cin >> man >> cow;
    ::memset(arrA,0,sizeof(arrA));

    //入队
    d.push_front(point(man,0));
    arrA[man] = 1;

    BFS(d);
    cout << ::min;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值