C++ bfs反向搜索(五十七)【第四篇】

今天我们来学习bfs的反向搜索。

1.反向搜索

反向搜索:是从目标状态出发进行的搜索,一般用于终点状态唯一,起点状态有多种,且状态转移是可逆的(无向边)情况。

例题:在一个长度为 n 的坐标轴上,有一个非常特别的整数位置 T。蒜头君有 Q 次询问,每次询问蒜头君想要知道从整数位置 S 移动到整数位置 T 的最少移动次数。

他的移动规则如下:

  1. 向前一步,坐标增加 1

  2. 向后一步,坐标减少 1 

  3. 跳跃一步,使得坐标乘 2

蒜头君不能移动到坐标小于 
0 或大于 n 的位置。(0≤S,T≤n≤5000,1≤Q≤10的4次方)

按照之前我们学习的课程,对于每次询问,当我们获得 
S 后,可以按照移动规则使用 BFS 计算出 
S→T 的最少移动次数。

下图为 S 分别等于1,3,T=4 的情况。

图片

因为每次询问我们都需要进行 BFS,所以程序是十分低效的。

我们可以发现终点 
T 是唯一的,所以我们可以考虑从 T 开始进行反向搜索,计算出 T 到达每个位置的最短距离 dis[],当我们在输入 S 进行查询时,直接输出 dis[S] 的值即可。(注:S→T 的最短距离等于 
T→S的最短距离)

图片

但是在搜索的过程中,我们需要改变移动规则(与原规则 
1,2,3 对应):

  1. 向后一步,坐标减少 1。

  2. 向前一步,坐标增加 1。

  3. 如果当前位置为偶数,则跳跃一步,使得坐标除 2;否则不执行

那我们就来使用反向搜索来解决《一维坐标的移动》这道题目。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
int n, dis[5005];
queue < int > q;
void bfs(int start) {memset(dis, -1, sizeof(dis));dis[start] = 0;q.push(start);while (!q.empty()) {int now = q.front();q.pop();if (now - 1 >= 0 && dis[now - 1] == -1) {dis[now - 1] = dis[now] + 1;q.push(now - 1);}if (now + 1 <= n && dis[now + 1] == -1) {dis[now + 1] = dis[now] + 1;q.push(now + 1);}if (now != 0 && now % 2 == 0 && dis[now / 2] == -1) {dis[now / 2] = dis[now] + 1;q.push(now / 2);}}
}
int main() {freopen("move.in", "r", stdin);freopen("move.out", "w", stdout);int Q, T;cin >> n >> T >> Q;bfs(T);while (Q--) {int S;cin >> S;cout << dis[S] << endl;}return 0;
}

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

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

相关文章

医药零售企业运营BI解决方案 连锁药房大数据解决方案 药店大数据解决方案

一、项目背景 连锁药店大数据项目建设的背景可以从以下几个方面进行分析: 行业趋势:随着医药行业的快速发展,连锁药店已成为药品零售的主要渠道。然而,随着市场竞争的加剧,连锁药店需要寻找新的竞争优势。通过大数据技术,连锁药店可以更好地了解消费者需求,提供个性化的…

2024年【T电梯修理】报名考试及T电梯修理复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 T电梯修理报名考试参考答案及T电梯修理考试试题解析是安全生产模拟考试一点通题库老师及T电梯修理操作证已考过的学员汇总&#xff0c;相对有效帮助T电梯修理复审考试学员顺利通过考试。 1、【多选题】增加旧电梯曳引…

p图考试,搜题软件哪个好?如何利用大学搜题工具查找特定学科的题目? #微信#知识分享

大学生必备&#xff0c;这条笔记大数据一定定要推给刚上大学的学弟学妹&#xff01;&#xff01; 1.三羊搜题 这是个微信公众号 是个公众号&#xff0c;支持文字、语音、截图搜题&#xff0c;截图搜题&#xff0c;同时也支持相似题查看及解析&#xff0c;因为可以在电脑上使…

【医学图像分割 2024】VM-UNet

文章目录 【医学图像分割 2024】VM-UNet摘要1. 介绍2. 预备知识3. 方法3.1 VM-UNet3.2 VSS Block3.3 损失函数 4. 实验4.1 数据集4.2 实现细节4.3 主要结果4.4 消融实验 5. 结果 【医学图像分割 2024】VM-UNet 论文题目&#xff1a;VM-UNet Vision Mamba UNet for Medical Imag…

Junit测试套件(Test Suite)

0. 什么是测试套件 对多个测试类的统一执行 只有一个测试类 点击一下执行就好有 5个测试类 分别打开 挨个点执行有100个测试类 &#xff1f;&#xff1f;分别点开执行 为100个测试类创建一个测试套件&#xff0c;然后再执行一次测试套件 √ 一个测试套件“囊括“三个测试类…

[嵌入式系统-16]:RT-Thread -2- 主要功能功能组件详解与API函数说明

目录 一、RT-Thread主要功能组件 二、内核组件 2.1 概述 2.2 API 三、设备驱动 3.1 概述 3.2 API 四、通信组件 4.1 概述 4.4 API 五、网络组件 5.1 概述 5.2 API 5.3 补充&#xff1a;MQTT协议 六、文件系统 6.1 概述 6.2 API 七、GUI 组件 7.1 概述 7.2 …

[office] Excel CHITEST 函数 使用实例教程 #媒体#知识分享#其他

Excel CHITEST 函数 使用实例教程 提示 此函数已由 CHISQ.TEST 函数替换&#xff0c;新函数可以提供更好的精确度&#xff0c;其名称更好地反映其用法。旧函数仍可用于与早期版本Excel 的兼容。但是&#xff0c;如果不需要向后兼容&#xff0c;那么应考虑直接使用新函数&…

【AIGC】Stable Diffusion的模型微调

为什么要做模型微调 模型微调可以在现有模型的基础上&#xff0c;让AI懂得如何更精确生成/生成特定的风格、概念、角色、姿势、对象。Stable Diffusion 模型的微调方法通常依赖于您要微调的具体任务和数据。 下面是一个通用的微调过程的概述&#xff1a; 准备数据集&#xf…

平时积累的FPGA知识点(6)

平时在FPGA群聊等积累的FPGA知识点&#xff0c;第六期&#xff1a; 1 万兆网接口&#xff0c;发三十万包&#xff0c;会出现掉几包的情况&#xff0c;为什么&#xff1f; 原因&#xff1a;没做时钟约束&#xff0c;万兆网接口的实现&#xff0c;本质上都是高速serdes&#xf…

MinGW下载安装教程 傻瓜式操作【超详细】

一、下载 下载地址&#xff1a;MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net 点击“Download Latest Version”即可 注意&#xff1a;小伙伴儿们也可以私信我要安装包。 二、安装 下载完成后&#xff0c;会得到一个名为 mingw-get-setup.exe 的安…

机器学习网格搜索超参数优化实战(随机森林) ##4

文章目录 基于Kaggle电信用户流失案例数据&#xff08;可在官网进行下载&#xff09;数据预处理模块时序特征衍生第一轮网格搜索第二轮搜索第三轮搜索第四轮搜索第五轮搜索 基于Kaggle电信用户流失案例数据&#xff08;可在官网进行下载&#xff09; 导入库 # 基础数据科学运…

GNU工具

GNU GNUs Not Unix OSS open source software 最初的Linux缺少实用工具来实现标准功能 GNU组织开发了一套完整的Unix实用工具&#xff0c;但是缺少用于支撑其运行的内核系统 由此&#xff0c;Linux内核 GNU操作系统实用工具 构成了一个完整的Linux操作系统 或者说&…

Docker之MySQL8安装、容器数卷挂载、数据库导入导出操作

Docker之MySQL8安装、容器数卷挂载、数据库导入导出操作 文章目录 Docker之MySQL8安装、容器数卷挂载、数据库导入导出操作1. 拉取镜像与运行容器2. 进入容器登录数据库3. 导出数据库1. 导出数据库2. 导出常见问题4. 导入数据库到myql容器中 Docker中安装Mysql8 1. 拉取镜像与运…

MySQL性能调优篇(9)-数据库的水平与垂直分割

在大规模互联网应用中&#xff0c;数据库的性能和可扩展性是至关重要的。为了满足高并发和大规模数据需求&#xff0c;水平和垂直分割成为了大型数据库架构的关键概念。在本篇博客中&#xff0c;我将介绍MySQL数据库的水平和垂直分割的概念、原则、示例以及其优缺点。 水平分割…

系统架构27 - 软件架构设计(6)

基于架构的软件开发方法 基于架构的软件开发方法&#xff08;ABSD&#xff09;概述概念与术语开发模型体系结构需求体系结构设计体系结构文档化体系结构复审体系结构实现体系结构的演化 基于架构的软件开发方法&#xff08;ABSD&#xff09; 基于体系结构的软件设计 (Architec…

算法专题:线性DP

参考练习习题总集 文章目录 10. 正则表达式匹配44. 通配符匹配45. 跳跃游戏53. 最大子数组和91. 解码方法97. 交错字符串115. 不同的子序列119. 杨辉三角IILCR 161. 连续天数的最高销售额 10. 正则表达式匹配 第一道题就是困难题让我很难蚌。真是磨人啊。 class Solution { …

【JavaEE】_文件与IO

目录 1.文件概述 1.1 文件的概念 1.2 文件的存储 1.3 文件的分类 1.4 目录结构 1.5 文件操作 1.5.1 文件系统操作 1.5.2 文件内容操作 2. Java文件系统操作 2.1 File类所处的包 2.2 构造方法 2.3 方法 2.3.1 与文件路径、文件名有关的方法 2.3.2 文件是否存在与普…

RISC-V和ARM

参考&#xff1a;https://www.eet-china.com/mp/a39867.html RISC-V和ARM都是基于**精简指令集计算 (RISC)**原理建立的指令集架构。他们的主要区别在于他们的授权模式和开放性&#xff1a; ARM 是一种专有的指令集架构&#xff0c;众多使用ARM架构的厂商&#xff0c;只能根据…

openGauss学习笔记-221 openGauss性能调优-确定性能调优范围-分析作业是否被阻塞

文章目录 openGauss学习笔记-221 openGauss性能调优-确定性能调优范围-分析作业是否被阻塞221.1 操作步骤 openGauss学习笔记-221 openGauss性能调优-确定性能调优范围-分析作业是否被阻塞 数据库系统运行时&#xff0c;在某些业务场景下查询语句会被阻塞&#xff0c;导致语句…

【MySQL】操作库 —— 表的操作 -- 详解

一、增加表 1、创建表 mysql> create database [if not exists] table_name ( -> field1 datatype, -> field2 datatype, -> field3 datatype -> ) character set 字符集 collate 校验规则 engine 存储引擎; 注意 &#xff1a;最后一行也可以写成&#x…