noi 2971 抓住那头牛

2971:抓住那头牛

总时间限制: 
2000ms
 
内存限制: 
65536kB
描述

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点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 Node {
    int x;
    int step;
};

bool vis[100000];

int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    Node u;
    u.x = n;
    u.step = 0;
    queue<Node> q;
    q.push(u);
    while(!q.empty()) {
        u = q.front();
        q.pop();
        if(u.x==k) {
            printf("%d
",u.step);
            break;
        }
        Node x=u,y=u,z=u;
        x.x --;
        x.step ++;

        if(x.x>=0&&!vis[x.x]) {
            vis[x.x] = true;
            q.push(x);
        }

        y.x ++;
        y.step ++;

        if(y.x<=100000&&!vis[y.x]) {
            vis[y.x] = true;
            q.push(y);
        }

        z.x = z.x*2;
        z.step ++;
        if(z.x<=100000&&!vis[z.x]) {
            vis[z.x] = true;
            q.push(z);
        }
    }

    return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/6063543.html