BFS宽度优先搜索例题(蓝桥杯)——逃跑的牛

news2024/11/23 13:51:49

问题描述:

  农夫John的一头牛逃跑了,他想要将逃跑的牛找回来。现假设农夫John和牛的位置都在一条直线上,农夫John的初始位置为N(0≤N≤100,000),牛的初始位置为K(0≤K≤100,000)。农夫John有两种移动方式:行走和传送。
  行走:农夫John可以从当前位置X移动到X-1或X+1,花费时间1分钟。
  传送:农夫John可以从当前位置X传送到2×X,花费时间1分钟。
  现假设牛逃跑后的位置一直保持不变,请编写一个程序,计算农夫John找到牛的最短时间。

输入格式:输入N和K(中间用一个空格间隔)。

输出格式:输出最短的寻找时间,单位分钟。

方法:

        宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

分析:

首先,每一步(节点)都有两个信息要素:当前距离和时间,故声明一个结构体

struct S
{
    int time;
    int add;
}

其次,bfs多使用队列(queue)进行各个分支的遍历,队列:先进先出

queue<S> q;

首先第一个节点是:

S s0={0,n}; //cin>>n>>k;

bfs的关键思路是遍历队列中的每个节点,进行i(i=3)次操作,生成i个新的节点,继续放在队列中。(每次操作需要pop当前遍历到的节点,观察是否达到目标,如果有,跳出当前操作,没有就做对应的操作,生成对应三个操作后的新节点放入队列中)

        因为每一层操作都是time+1,整个搜索过程是按照一层一层搜索的,所以只要当前没有结束搜索,那么此时这个一定是最快的方法(之一)直接退出搜索就好了:输出最优解时间。

while(!q.empty()) //队列不空
{
    0.取出队列首元素 S s=q.front();
    1.判断是否达到目标?跳出搜索:进行三种操作并生成对应节点,放入队列
    2.三个操作
   (1) (s.add+1) 创造新节点s1={s.time+1,a.add+1},放入队列
   (2) (s.add-1) 创造新节点s1={s.time+1,a.add-1},放入队列
   (3) (s.add*2) 创造新节点s1={s.time+1,a.add*2},放入队列
}

优化操作:进行剪枝

剪枝情况1:创建一个flag数组,登记当前add情况有没有在此之前就搜索过(如果之前有,那么当前搜索状况一定不是最优的,没必要按照当前这条路继续搜索下去)——搜索过就不搜索了

剪枝情况2:如果当前add<=0 则不需要进行add-1和add*2的操作——不进行无意义的操作

剪枝情况3:如果add>k 则不进行add+1和add*2的操作——同上

特殊情况:牛在农夫前面(n>k),只能进行操作(2),直接输出结果即可(但是由于剪枝的存在,这样的特殊情况特殊处理不会带来特别大的优化)

while(!q.empty()) //队列不空
{
    0.取出队列首元素 S s=q.front();
    1.判断是否搜索过(flag)?如果没有:
        {
            2.判断是否达到目标?如果有:跳出搜索,输出最短时间。否则:
            {
                3.判断是否add<=0?只进行操作(1)
                  判断是否add>k?只进行操作(2)
                  否则:进行三个操作
            }
            4.将flag置为1(已搜索)
        }
}

代码实现: 

#include<iostream>
#include<queue>
using namespace std;

struct S{
    int time;//所用时间
    int add;//当前位置
};


int flag[200000] = {0};//标识对应位置是否求过
queue<S> q;//队列存储当前操作节点
int k;//全局对照量(目标距离k)

void bfs()
{
    while(!q.empty())//队列不为空继续搜索
    {
        S s = q.front();//头结点
        cout<<"现在遍历节点为:add="<<s.add<<" time="<<s.time<<endl;
        q.pop();//删除头结点
        if(flag[s.add]==0)//(剪枝1)
        {
            if(s.add==k)//农夫的位置和牛的位置一样,抓到了
            {
                cout << "农夫的位置和牛的位置相同(抓到牛了) 花费时间:"<<s.time << endl;
                break;//跳出while循环
            }
            //三个操作
            S next;//创建新节点
            next.time = s.time + 1;//所有操作都是time+1

            if(s.add>k)//(剪枝2)
            {
                next.add = s.add - 1;
                q.push(next);
                cout<<"新节点入队: add="<<next.add<<" time="<<next.time<<endl;
            }
            else if(s.add<=0)
            {
                next.add = s.add + 1;
                q.push(next);
                cout<<"新节点入队: add="<<next.add<<" time="<<next.time<<endl;
            }
            else
            {
                next.add = s.add - 1;
                q.push(next);
                cout<<"新节点入队: add="<<next.add<<" time="<<next.time<<endl;
                next.add = s.add + 1;
                q.push(next);
                cout<<"新节点入队: add="<<next.add<<" time="<<next.time<<endl;
                next.add = s.add * 2;
                q.push(next);
                cout<<"新节点入队: add="<<next.add<<" time="<<next.time<<endl;
            }
            flag[s.add] = 1;//标识这个位置计算过了
        }
    }

}

int main()
{
    int n;//农夫的位置
    cin >> n >> k;
    S s={0,n};
    q.push(s);
    bfs();//进行宽度优先搜索
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1588654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySOL之旅--------MySQL数据库基础( 3 )

本篇碎碎念:要相信啊,胜利就在前方,要是因为一点小事就停滞不前,可能你也不适合获取胜利,成功的路上会伴有泥石,但是走到最后,你会发现身上的泥泞皆是荣耀的勋章! 今日份励志文案: 凡是发生皆有利于我 目录 查询(select) 1.全列查询 2.指定列查询 3.查询字段为表达式 ​编…

数据库被rmallox勒索病毒加密,如何还原?

近年来&#xff0c;网络安全问题日益严峻&#xff0c;勒索病毒作为其中的一种恶意软件&#xff0c;已成为网络安全领域的一大难题。其中&#xff0c;rmallox勒索病毒以其高度的隐蔽性和破坏性&#xff0c;给不少企业和个人带来了严重损失。本文将从rmallox勒索病毒的特点、传播…

【2024年MathorCup数模竞赛】C题赛题与解题思路

2024年MathorCup数模竞赛C题 题目 物流网络分拣中心货量预测及人员排班背景求解问题 解题思路问题一问题二问题三问题四 本次竞赛的C题是对物流网络分拣中心的货量预测及人员排班问题进行规划。整个问题可以分为两个部分&#xff0c;一是对时间序列进行预测&#xff0c;二是对人…

C++初阶:模板进阶

非类型模板参数 模板参数分为类型形参与非类型形参 。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在 class 或者 typename 之类的参数类型名称 。 非类型形参&#xff0c;就是用一个常量作为类 ( 函数 ) 模板的一个参数&#xff0c;在类 ( 函数 ) 模板中可将…

7、configMap

1、configMap是什么 类似与pod的配置中心&#xff0c;不会因为pod的创建销毁&#xff0c;相关配置发生改变 pod定义硬编码意味着需要有效区分⽣产环境与开发过程中的pod 定义。为了能在多个环境下复⽤pod的定义&#xff0c;需要将配置从pod定义描 述中解耦出来。 2、向容器中…

HarmonyOS实战开发-证书管理、如何实现对签名数据进行校验功能。

介绍 本示例使用了ohos.security.certManager相关接口实现了对签名数据进行校验的功能。 实现场景如下&#xff1a; 1&#xff09;使用正确的原始数据和签名数据进行签名校验场景&#xff1a;模拟服务端对签名数据进行校验&#xff0c;验证客户端身份和原始数据完整性。 2&…

智慧污水井物联网远程监控案例

智慧污水井物联网远程监控案例 在当今数字化转型的浪潮中&#xff0c;智慧水务已成为城市基础设施建设的重要组成部分。其中&#xff0c;基于物联网技术的智慧污水井远程监控系统以其高效、精准、实时的特性&#xff0c;在提升污水处理效能、保障城市水环境安全、实现精细化管…

数据资产可能是个伪命题?

✅作者简介&#xff1a;《数据运营&#xff1a;数据分析模型撬动新零售实战》作者、《数据实践之美》作者、数据科技公司创始人、多次参加国家级大数据行业标准研讨及制定、高端企培合作讲师。 &#x1f338;公众号&#xff1a;风姑娘的数字视角&#xff0c;免费分享数据应用相…

【分享】跨境虾皮Shopee各区域商品详情API返回值(商品,订单,面单等)♥

虾皮(shopee)是一个亚洲区域的电商平台&#xff0c;主要在东南亚地区提供电商服务。虾皮提供了丰富的电商数据&#xff0c;包括商品数据、订单数据、会员数据、评价数据等。 虾皮Shopee♥♥​​​​​​​♥​​​​​​​♥​​​​​​​♥​​​​​​​♥ 1.授权 ​ 接口…

Matlab 将数据写入excel文件

Matlab 将数据写入excel文件 函数&#xff1a;writematrix 功能&#xff1a;将矩阵写入文件 语法 writematrix(A) writematrix(A,filename) writematrix(___,Name,Value) 说明 writematrix(A) 将同构数组 A 写入以逗号分隔的文本文件。文件名为数组的工作区变量名称&…

点动、电子凸轮、电子齿轮

一、常见的运动模式有三种 1、点位运动&#xff1a;进队终点的位置有要求&#xff0c;不在乎运动轨迹。要求定位速度快。可分为JOG电动、MOVE寸动、和VMOVE持续运动三类。 2、连续轨迹运动&#xff1a;也称为插补&#xff0c;系统在高速运动的情况下&#xff0c;既要保证轮廓…

中文分词,c++应用,想到jieba分词,结果还的自己封装。探索中

一、研究背景 随着互联网的快速发展&#xff0c;信息也呈了爆炸式的增长趋势。在海量的信息中&#xff0c;我们如何快速抽取出有效信息成为了必须要解决的问题。由于信息处理的重复性&#xff0c;而计算机又善于处理机械的、重复的、有规律可循的工作&#xff0c;因此自然就…

技术必备:接口自动化测试数据校验神器【JSonPath】

我们今天不讲如何开发一款自定义开发校验规则库&#xff0c;而是给大家分享一款在开发自定义校验规则库或者常规的接口自动化测试时&#xff0c;经常会用到的一款数据提取神器&#xff1a;JSonPath。 1. JSonPath介绍 JSonPath是一种简单的方法来提取给定JSON文档的部分内容。…

Visual Components对重型机械工业的影响 衡祖仿真

一、重型机械行业面临的挑战 此行业制造商面临着许多挑战&#xff0c;首先是世界各地实施的环境法规不断增多&#xff0c;可持续建筑实践、改善空气质量和减少排放已成为产品设计和开发背后的主要驱动力&#xff0c;健康和安全标准也在不断发展&#xff0c;给已经面临熟练劳动…

Mongodb入门--头歌实验MongoDB 复制集 分片

一、MongoDB之副本集配置 1.1MongoDB主从复制 主从复制是MongoDB最早使用的复制方式&#xff0c; 该复制方式易于配置&#xff0c;并且可以支持任意数量的从节点服务器&#xff0c;与使用单节点模式相比有如下优点&#xff1a; 在从服务器上存储数据副本&#xff0c;提高了数…

机器学习——模型融合:Boosting算法

机器学习——模型融合&#xff1a;Boosting算法 1. Boosting核心思想 Boosting算法是一种集成学习方法&#xff0c;其核心思想是通过组合多个弱学习器&#xff08;即准确率略高于随机猜测的学习器&#xff09;来构建一个强学习器&#xff08;即准确率较高的学习器&#xff09…

【C++】——list的介绍及使用 模拟实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.…

open-sora

Open-Sora&#xff0c;高效复现类Sora视频生成方案开源&#xff01;魔搭社区最佳实践教程来啦&#xff01;https://mp.weixin.qq.com/s/WMQIDgZs2MBPGtx18XSXgw Open-Sora开源方案讲解开源但“平替”的方案。https://mp.weixin.qq.com/s/nPYCzgBA7hIsPZ6PCyXxKQOpen-Sora/docs…

蓝桥杯真题Day48 倒计时5天 练了几道真题小程序+回溯剪枝应用一个小程序

[蓝桥杯 2023 省 A] 更小的数 题目描述 小蓝有一个长度均为 n 且仅由数字字符 0∼9 组成的字符串&#xff0c;下标从0到 n−1&#xff0c;你可以将其视作是一个具有n位的十进制数字num&#xff0c;小蓝可以从num 中选出一段连续的子串并将子串进行反转&#xff0c;最多反转一次…

系统思考—策略性陪伴

每次与客户的相遇和合作&#xff0c;我都深感这不仅是工作的一部分&#xff0c;更是缘分的一种体现。释迦摩尼曾说&#xff1a;“只有很深很深的缘份&#xff0c;才能在同一条路上走了又走&#xff0c;同一个地方去了又去&#xff0c;同一个人见了又见。” 这些话让我更加珍惜与…