广度优先搜索(BFS)——抓住那头牛(POJ 4001)

本文将以(POJ 4001)抓住那头牛 为例,讲解经典算法广度优先搜索(BFS)的STL写法

在实际写算法中,怎么能不使用更快、更方便、更准确、更高效的C++ STL模板呢

相信很多人都了解过广度优先搜索算法是怎么实现的,那么这里将引入实际例子,

看看在算法求解过程中应该怎么去使用。

总时间限制: 2000ms     内存限制: 65536kB

描述

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

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

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

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

输入

两个整数,N和K

输出

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

样例输入

5 17

样例输出

4

解题思路:

由于是求最短时间,所以考虑BFS,题目没有给出图的路径,而是根据题目已知条件,

所以也不用单独开二维数组来保存图,只需要一个Book数组来判断是否已经走过即可

用结构体存放路径的值以及步长,为了在加入结点时显得简洁,我们在结构体内设置

函数,省去定义结构体变量赋值的过程。

解题没什么难度(凡尔赛),就是最普通的BFS即可,

加入新的点时,注意下标范围和判断是否走过就行了

最后放上AC代码,大家可以点击文章开头的链接,去北大OJ实现一下!

解题代码:

#include

#include<stdio.h>

#include<math.h>

#include<string.h>

#include<stdlib.h>

#include

#include

using namespace std;

int N,K;

const int MaxN = 100000;

int book[100010];

struct Step{

int x;

int steps;

Step(int xx,int s):x(xx),steps(s){}

};

queue q;

int main(){

cin>>N>>K;

q.push(Step(N,0));

book[N] = 1
;

while(!q.empty()){

Step s = q.front();

if(s.x == K){

cout<<s.steps<<endl;

return 0;

}

else{ //将三个方向入队

if(s.x - 1 >= 0 && !book[s.x - 1]){

q.push(Step(s.x-1,s.steps+1));

book[s.x-1] = 1;

}

if(s.x + 1 <= MaxN && !book[s.x + 1]){

q.push(Step(s.x+1,s.steps+1));

book[s.x+1] = 1;

}

if(s.x * 2 <= MaxN && !book[s.x * 2]){

q.push(Step(s.x*2,s.steps+1));

book[s.x*2] = 1;

}
q.pop(); //出队
}
}
return 0;
}

最后

小编这些年深知大多数初中级工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此我收集整理了一份《2024年Java全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你需要这些资料,⬅专栏获取
片转存中…(img-Si6G6YVE-1719686024419)]

[外链图片转存中…(img-yhsBULzp-1719686024420)]

[外链图片转存中…(img-SCH8WolL-1719686024420)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你需要这些资料,⬅专栏获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值