抓住那头牛

题目链接http://noi.openjudge.cn/ch0205/2971/

描述

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

1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
 
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
5 17
样例输出
4

查看

我用DFS无论怎么优化都超时,用BFS轻松就过了。这题比较适合用BFS,而且实现也比较容易。跟dfs一样,这里不需要显示的建图,每个状态看成一个节点,状态的转移看成边,状态的转移有三种方法,所以每个节点只有三条边,是确定的。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#define DEBUG(x) cout<<#x<<" = "<<x<<endl
const int MAXN=1e5+10;
using namespace std;
struct Node{
    int pos;///农夫的位置
    int steps;
    Node(){}
    Node(int xx,int s):pos(xx),steps(s){}
};
queue<Node>q;
int visited[MAXN];
int main()
{
//    freopen("in.txt","r",stdin);
    int N,K;
    cin>>N>>K;
    memset(visited,0,sizeof(visited));
    q.push(Node(N,0));
    visited[N]=true;
    while(!q.empty()){
        Node t=q.front();
        q.pop();
        if(t.pos==K){
            cout<<t.steps<<endl;
            return 0;
        }
        if(t.pos-1>=0&&!visited[t.pos-1]){
            q.push(Node(t.pos-1,t.steps+1));
            visited[t.pos-1]=true;
        }
        if(t.pos+1<=MAXN&&!visited[t.pos+1]){
            q.push(Node(t.pos+1,t.steps+1));
            visited[t.pos+1]=true;
        }
        if(t.pos*2<=MAXN&&!visited[t.pos*2]){
            q.push(Node(t.pos*2,t.steps+1));
            visited[t.pos*2]=true;
        }
    }
}
原文地址:https://www.cnblogs.com/MalcolmMeng/p/9268462.html