• 【OJ】抓牛问题


    /*
    农夫John的奶牛跑路了。将地图视作一条数轴,John的初始位置在s而奶牛的位置在t(0<=s,t<=100000)。John可以花费一分钟的时间使自己作如下移动:
    
    1 从点x移动到点x+1
    2 从点x移动到点x-1
    3 从点x移动到点x*2
    奶牛的位置一直在点t。现在给定s,t,要求John要追上奶牛最少需要几分钟。
    
    Sample Input:
    5 17
    
    Sample Output:
    4
    
    Description:
    5->4->8->16->17
    */
    
    #include<iostream>
    #include<queue>
    #include<cmath>
    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int M=100010;
    
    int bfs(int s,int t)
    {
        queue<int> q;
        int head,next;
        int vis[M],step[M];
        memset(vis,0,sizeof(vis));
        memset(step,0,sizeof(step));
        q.push(s);
        step[s]=0;
        
        while(!q.empty())
        {
            head=q.front();
            q.pop();
            for(int i=0;i<3;i++)
            {
                if(i==0)
                    next=head-1;
                if(i==1)
                    next=head+1;
                if(i==2)
                    next=head*2;
                if(next<0||next>M)
                    continue;
                if(vis[next]==0)
                {
                    vis[next]++;
                    step[next]=step[head]+1;
                    q.push(next);
                }
                if(next==t)
                    return step[next];
            }
        }
    }
    
    
    int main()
    {
        int s,t;
        while(scanf("%d %d",&s,&t)==2&&s>=0&&t<=M)
        {
            if(t<=s)//牛在人后面 
                cout<<abs(s-t)<<endl;
            else 
                cout<<bfs(s,t)<<endl;
        }
        
        return 0;
    }
    
    
    /*
    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<cstdio>
    using namespace std;
     
    const int maxn=100001;
     
    bool vis[maxn];//标记数组
    int step[maxn];//记录到了每一位置所走的步数
    queue <int> q;//定义队列
     
    int bfs(int n,int k)
    {
        int head,next;
        q.push(n);   //开始FJ在n位置,n入队
        step[n]=0;
        vis[n]=true; //标记已访问
        while(!q.empty())  //当队列非空
        {
            head=q.front();  //取队首
            q.pop();         //弹出对首
            for(int i=0;i<3;i++)     //FJ的三种走法
            {
                if(i==0) next=head-1;
                else if(i==1) next=head+1;
                else next=head*2;
                if(next<0 || next>=maxn) continue; //排除出界情况
                if(!vis[next])  //如果next位置未被访问
                {
                    q.push(next);    //入队
                    step[next]=step[head]+1;  //步数+1
                    vis[next]=true;  //标记已访问
                }
                if(next==k) return step[next];  //当遍历到结果,返回步数
            }
        }
    }
    int main()
    {
        int n,k;
        while(cin>>n>>k)
        {
            memset(step,0,sizeof(step));
            memset(vis,false,sizeof(vis));
            
            while(!q.empty()) q.pop(); //注意调用前要先清空
            if(n>=k) printf("%d
    ",n-k);
            else printf("%d
    ",bfs(n,k));
        }
        return 0;
    }
    */
    
    /*
    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<cstdio>
    #include <algorithm>
    using namespace std;
     
    queue<int> q;
    int  m,n;
    int step[100010];
    int vis[100010];
    int rear,front;//rear表示下一步 
    int BFS(){
        int i;
        q.push(n);//把农民的位置压入队列 
        step[n]=0;//步数记为0 
        vis[n]=1;////标记这个点走过 
        while(!q.empty()){//队列不为空哦时执行 
            front=q.front();//最开始的位置 
            q.pop();//弹出队列头 
            for(i=0;i<3;i++)//三种走法,三种循环 
            {
                if(i==0)
                rear=front+1;//第一种下一步+1 
                if(i==1)
                rear=front-1;//第二种下一步-1 
                if(i==2)
                rear=front*2;//第三种步数翻倍 
                if(rear>=0&&rear<=100000&&vis[rear]==0)//判断是否越界,并且这一步没有走过 
                {
                    vis[rear]=1;//标记这一步走过了 
                    step[rear]=step[front]+1;// 步数+1 
                    q.push(rear);//将当前位置压入队列 
                }
                if(rear==m)return step[rear];
            }
        }return -1;
        
    }
     
    int main()
    {
        
        cin>>n>>m;
            memset(step,0,sizeof(step));//初始化为0 
            memset(vis,0,sizeof(vis));//初始化为false
            cout<<BFS();
        
        return 0;
    }
    */

    tz@HZAU

    2019/3/4

  • 相关阅读:
    ubuntu配置jdk和tomcat+部署java项目[最佳实践]
    jQuery TreeGrid
    关于json的一些误解
    jQuery2.0.3源码分析-1(持续更新中......)
    webstrom一些常用快捷键
    js插件-Map插件
    webstorm-删除项目
    随笔-20131209
    软件开发模式对比(瀑布、迭代、螺旋、敏捷)
    javascript学习(10)——[知识储备]链式调用
  • 原文地址:https://www.cnblogs.com/acm-icpcer/p/10469323.html
Copyright © 2020-2023  润新知