抓住那头牛-BFS

本文探讨了一道经典的算法题目,即如何计算农夫在数轴上以特定移动规则捕捉静止不动的牛所需的最短时间。通过使用广度优先搜索(BFS)算法,我们实现了高效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

农夫知道一头牛的位置,想要抓住它。
农夫和牛都位于数轴上,农夫起始位于点 NN,牛位于点 KK。
农夫有两种移动方式:

从 XX 移动到 X−1X−1 或 X+1X+1,每次移动花费一分钟
从 XX 移动到 2∗X2∗X,每次移动花费一分钟

假设牛没有意识到农夫的行动,站在原地不动。
农夫最少要花多少时间才能抓住牛?
输入格式
共一行,包含两个整数N和K。
输出格式
输出一个整数,表示抓到牛所花费的最少时间。
数据范围
0≤N,K≤1050≤N,K≤105
输入样例:
5 17

输出样例:
4

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=2e5+10;
int dist[N];
int q[N];
int n,k;
int bfs(){
 memset(dist,-1,sizeof dist);
 dist[n]=0;
 q[0]=n;
 int hh=0,tt=0;
 while(hh<=tt){
  int t=q[hh++];
  if(t == k)   return dist[t];
  if(t+1<N && dist[t+1] == -1){
   dist[t+1]=dist[t]+1;
   q[tt ++ ] = t + 1;
  }
  if(t-1 >= 0 && dist[t - 1] == -1){
   dist[t - 1] = dist[t] + 1;
   q[tt ++ ] = t - 1;
  }
  if(t*2 <= N && dist[t * 2] == -1){
   dist[t*2] = dist[t] + 1;
   q[tt ++ ] = t*2;
  }  
 }
 return -1;
}
int main(){
 cin>>n>>k;
 cout<<bfs()<<endl;
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值