1253:抓住那头牛

1253:抓住那头牛


时间限制: 1000 ms         内存限制: 65536 KB
提交数:32800    通过数: 13223

【题目描述】

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

1、从X�移动到X−1�−1或X+1�+1,每次移动花费一分钟

2、从X移动到2×X2×�,每次移动花费一分钟

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

【输入】

两个整数,N�和K�。

【输出】

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

【输入样例】

5 17

【输出样例】

4

样例代码?(1):

#include<bits/stdc++.h>
using namespace std;
int a[100005];//数轴
int vis[100005];//标记
int n,k;//农夫和牛所在的位置
int head,tail;//队列的队首和队尾
struct node{
    int x,step;
}que[100005];//创建队列
void bfs(int nx,int cnt1){
    if(nx>=0&&nx<=100000&&vis[nx]==0){
        vis[nx]=1;
        que[tail].x=nx;
        que[tail].step=cnt1;
        tail++;
    }
}
int main(){
    cin>>n>>k;
    head=tail=1;
    que[head].x=n;//农夫作为起点
    vis[n]=1;//给起点打标记
    tail++;//队尾+1
    que[head].step=0;//初始步数为0
    while(head<tail){
        int fx=que[head].x;//变化坐标
        int cnt=que[head].step;//变化步数
        if(fx==k){//抓住牛
            cout<<cnt<<endl;
            return 0;
        }
        bfs(fx-1,cnt+1);//三种移动方式
        bfs(fx+1,cnt+1);
        bfs(fx*2,cnt+1);
        head++;
    }
    
    return 0;
}

(2):

#include<iostream>
using namespace std;
int q[1000005][2],tail=1,front=1;
bool f[1000005];
void print(){
    cout <<"距离:"; 
    for(int i=1;i<tail;i++){
        printf("%2d ",q[i][0]);
    }
    cout << endl;
    cout <<"步数:"; 
    for(int i=1;i<tail;i++){
        printf("%2d ",q[i][1]);
    }
    cout <<endl<<endl; 

int main() {
    int n,k;
    cin>>n>>k;

    q[tail][0]=n;
    q[tail][1]=0;
    tail++;
    f[n] = 1;
    while(front != tail) {
        int x = q[front][0];
        if(x==k) {
            cout <<q[front][1];
            return 0;
        }
        // 3种走法 
        for(int i=1; i<=3; i++) {
            int y;
            if(i==1) y = x+1;
            else if(i==2) y = x-1;
            else if(i==3) y = x*2;
            // 
            if(y>k+10 || y<0 || f[y]) continue;
            f[y] = 1;
             
            q[tail][0] = y;
            q[tail][1] = q[front][1] + 1;
            tail++;
//            print();
        }
        front++;

    }
    
    return 0;
}

  • 31
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值