• 抓住那头牛


    题目链接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;
            }
        }
    }
  • 相关阅读:
    第四次课堂作业
    12周课后作业
    12周上机(5.21)
    11周周五课后作业
    11周上机作业(5.14)
    第十周(5.7)上机
    第九周4.30上机作业
    第八周周五课后作业
    4.23 第八周上机作业
    4.17课后作业
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9268462.html
Copyright © 2020-2023  润新知