抓住那头牛

题目

题目描述

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

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

2、从X移动到2*X,每次移动花费一分钟

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

输入

两个整数,N和K

输出

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

样例输入

5 17

样例输出

4

思路

这道题是一道BFS,

农夫在每个点都有三条路可以选择,即类似于:在每一个结点都有三个相邻的结点。现在需要最短时间找到牛,所以用广搜是比较容易解决的。关键是要理清楚数据结构的问题。

因此,我们需要……无中生有暗度陈仓……生成一个数组,滨并将第一个设置为1(及走过的)

总之下来,这道题有点类似短路问题,确实BFS之中的精髓。

代码

#include<bits/stdc++.h>
using namespace std;
int vis[5000000];
int b[4];
int n,k;
queue <int> q;
void bfs(int n){
   q.push(n);
   while(!q.empty()){
       int tmp=q.front();
           if(tmp==k){
               cout<<vis[tmp]-1;
               return;
      }
b[1]=tmp-1;
      b[2]=tmp+1;
        b[3]=2*tmp;
      for(int i=1;i<4;i++){
           if(vis[b[i]]==0&&b[i]>=0&&b[i]<4*k){
              q.push(b[i]);
              vis[b[i]]=vis[tmp]+1;
          }
      }
      q.pop();
  }
}
int main(){
   cin>>n>>k;
   vis[n]=1;
   bfs(n);
   return 0;    
}

小编蒟蒻一个,有什么问题请大佬不惜赐教Orz

posted @ 2022-03-31 21:25  骆美辰  阅读(147)  评论(0编辑  收藏  举报
lock: { enable: true, background: 'https://img1.baidu.com/it/u=2788089125,168843488&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1690563600&t=35fa4326e773b3fbf83562ad746b7cd2',//锁屏背景 strings: [ 'Every win named never give up 每一份胜利都叫不放弃',//签名 ], },