题目链接:http://www.jxsfczx.cn:888/problem/37
时间:1 秒 空间:512 MB

题目描述

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

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

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

输入描述

两个整数,N和K。

输出描述

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

输入

5 17

输出

4

解题思路

BFS搜索。

#include <bits/stdc++.h>
using namespace std;
struct edge {
    int x, l;
}u;
int vis[150005], arr[2] = {1, -1};
int BFS(int s, int t) {
    int tx;
    vis[s] = 1;
    queue <edge> Q;
    Q.push((edge){s, 0});
    while (!Q.empty()) {
        u = Q.front();
        Q.pop();
        for (int i = 0; i < 3; i++) {
            if (!i)
                tx = u.x << 1;
            else tx = u.x + arr[i - 1];
            if (tx < 0 || tx > 150000 || vis[tx])
                continue;
            if (!(tx - t))
                    return u.l + 1;
            Q.push((edge){tx, u.l + 1});
            vis[tx] = 1;
        }
    }
    return -1;
}
int main() {
    int s, t;
    scanf("%d%d", &s, &t);
    printf("%d\n", BFS(s, t));
    return 0;
}