跳转至

一本通-1253:抓住那头牛(一维BFS)

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

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

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

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

【输入】 两个整数,N和K。

【输出】 一个整数,农夫抓到牛所要花费的最小分钟数。

【输入样例】 5 17

【输出样例】 4


#include <bits/stdc++.h>

using namespace std;

vector<int> path(1e5 + 5, INT_MAX);

int start, end;

void BFS()
{
    path[start] = 0;
    queue<int> q;
    q.push(start);

    while (!q.empty()) {
        int tmp = q.front(); q.pop();

        if (tmp == end) break;

        for (int i = 0; i < 3; ++i) {
            int nextPos;
            switch(i) {
                case 0: nextPos = tmp + 1; break;
                case 1: nextPos = tmp - 1; break;
                default: nextPos = (tmp << 1);
            }

            if (0 <= nextPos && nextPos <= 1e5 && path[nextPos] > path[tmp] + 1) {
                path[nextPos] = path[tmp] + 1;
                q.push(nextPos);
            }
        }
    }

    cout << path[end];
}



int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> start >> end;
    BFS();

    return 0;
}