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.hqwc.cn/news/471604.html

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

相关文章

JVM(5)面试篇

1 什么是JVM&#xff1f; 关联课程内容 基础篇-初识JVM基础篇-Java虚拟机的组成 回答路径 JVM的定义作用功能组成 1、定义&#xff1a; JVM 指的是Java虚拟机&#xff08; Java Virtual Machine &#xff09;。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是…

单片机学习笔记---直流电机驱动(PWM)

直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极&#xff0c;当电极正接时&#xff0c;电机正转&#xff0c;当电极反接时&#xff0c;电机反转 直流电机主要由永磁体&#xff08;定子&#xff09;、线圈&#xff08;转子&#xff09;和换向器…

C语言学习day14:数组定义和使用

定义变量&#xff1a; 数据类型 变量 值 数组定义&#xff1a; 数据类型 数组名[元素个数]{值1,值2,值3} 代码&#xff1a; int main() {//定义变量//数据类型 变量 值//数组定义//数据类型 数组名[元素个数]{值1,值2,值3}//数组下标 数组名[小标]//数组下标是…

【Redis快速入门】Redis三种集群搭建配置(主从集群、哨兵集群、分片集群)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

简易绘图软件(水一期)

哈哈&#xff01; 1、编写代码&#xff1a; 代码&#xff1a; main: #include <graphics.h> #include <music.h> #include <heker.h> #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )using…

Linux 幻兽帕鲁服务器怎么上传存档文件?

通过控制台远程连接到 Linux 服务器后&#xff0c;你可以打开文件树&#xff0c;然后找到幻兽帕鲁存档位置&#xff0c;将存档压缩包上传到 Pal 目录中。 记得替换存档前要先停止服务。 2. 然后将 Saved.tar 文件解压&#xff0c;并完全替换新服务器上的 Saved 存档目录即可。 …

python速成(2)、

​​​​​​​

【数据库】哪些操作会导致索引失效

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;数据库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在数据库管理中&#xff0c;索引的有效性对于查询性能至关重要。然而&#xff0c;索引可能会因为各种操…

P1649 Obstacle Course S(dfs卡方向数组/bfs)

传送门https://www.luogu.com.cn/problem/P1649 开始拿到题&#xff0c;发现数据范围是100&#xff0c;于是我尝试用dfs一做&#xff0c;写完后发现是90分&#xff0c;TLE一个点。于是乎观看题解&#xff08;我还以为能剪枝掉&#xff09;&#xff0c;发现改一下遍历方向就能过…

积分(二)——复化Simpson(C++)

前言 前言 simpson积分 simpson积分公式 ∫ a b f ( x ) d x ≈ b − a 6 [ f ( a ) f ( b ) 4 f ( a b 2 ) ] \int_{a}^{b}f(x)dx \approx \frac{b-a}{6}[f(a)f(b)4f(\frac{ab}{2})] ∫ab​f(x)dx≈6b−a​[f(a)f(b)4f(2ab​)] 与梯形积分类似&#xff0c;当区间[a,b]较…

AI大模型学习笔记之五:监督学习--数据如何驱动决策

监督学习&#xff0c;又称为监督式机器学习&#xff0c;是机器学习和人工智能领域的一个重要分支。 其基本原理是利用带有标签的数据集来训练算法&#xff0c;以实现精确分类数据或预测结果的目标。 在监督学习中&#xff0c;通过将数据输入模型&#xff0c;并不断调整数据权…

【知识整理】产研中心岗位评定标准之大数据岗位

为贯彻执行集团数字化转型的需要,该知识库将公示集团组织内各产研团队不同角色成员的职务“职级”岗位的评定标准; 一、定级定档目的 通过对公司现有岗位及相应岗位员工的工作能力、工作水平进行客观公正评定,确定各岗位的等级及同等级岗位员工对应的档级,从而为员工以后的晋升…