蓝桥杯算法之搜索章 - 2

大家好,接下来,我将带来对于搜索篇的新内容,这部分我将打算围绕DFS深度优先搜索去讲解。

温馨提示:由于这篇文章是接着上一篇文章的,如果新读者没有看过前一篇的话,推荐去看一下,不然有些地方可能会不懂。

接下来的每道题我相信大家都会有所收获的!

1.题目概述:

这部分我将讲解以下有关DFS的题目

1.选数 --- P1036 [NOIP 2002 普及组] 选数 - 洛谷

2.飞机降落 --- P9241 [蓝桥杯 2023 省 B] 飞机降落 - 洛谷

3.八皇后 --- P1219 [USACO1.5] 八皇后 Checker Challenge - 洛谷

4.数独 --- P1784 数独 - 洛谷

这部分的题比上篇文章的题难度要提高挺多,大家可以如果有所困难可以多多思考一下。

2.选数

大家会发现,如果看了我前面的算法篇1的话其实很容易解决dfs递归的内容的。

但是大家会发现这里有一个新问题:如何求解一个数是不是素数呢?

这个的话有挺多的方法的,我在这里就用了一个简单的方法

比如判断一个数x是不是素数,由素数的定义我们可以知道:素数是大于1的正整数,而且只能被自己和1整除。

那么我们就可以从2开始到x所有的数拿去试除即可解决。

但是要判断的这些数有点多了,我们就可以去选择试除到根号x即可,具体的原因网上有证明,有兴趣的读者可以去看看。

(如果想判断大量数字是否为素数,可以采用埃拉托色尼筛选法

大家在看题目,发现结果并不会因为数字的顺序不同而改变,所以是一种组合。

我们就得在dfs的参数中加入一个begin参数来表示从哪个数开始的

首先我们画一下这个决策树:

我们根据自己画的决策树就可以来写代码了:

当然这道题跟上篇文章中的思路是一样的,回溯递归

3.飞机降落

这道题的难度就比较高了,大家好好理解一下题目,可以尝试做一做

那跟着博主的思路一起来看一下这道题吧。

这道题会发现的是如果直接来做的话,要安排好每架飞机的顺序,保证该组飞机能够安全降落,那么如果怎么都安排不出来,就代表这个不能及时降落了。所以如何安排顺序就是我们的问题了

我们这时候就可以通过搜索去枚举出来所有情况。而且数据也是比较小的,通过搜索去做也不会出现超时,很显然也在暗示我们去搜索。

由于这道题的枚举类似排列,所以我们就不需要一个begin值去告诉该从什么位置递归了。

对于安排过的飞机,我们只需要通过一个bool st[]数组去标记一下即可。

当遇到了标记过的飞机就直接剪掉这个分支。

上一架飞机结束时间需要记录一下,因为上一架飞机结束时间  >  新飞机到达时间 + 最长盘旋时间,就代表了新飞机无法降落,我们也将这个分支给剪掉。

 那对于新飞机的结束时间怎么计算呢?

1.新飞机到达时间 >= 前一架飞机结束时间(新飞机到达的时间晚于前一架飞机的结束)

        那么新飞机结束时间 = 新飞机的到达时间   +   新飞机的降落时间

2.新飞机到达时间 < 前一架飞机结束时间

        比较一下

                新飞机到达时间 + 盘旋时间   是否大于等于   前一架飞机结束时间

        如果是 ---->  新飞机能正常降落 ---- 新飞机结束时间 = 前一架飞机结束时间 + 新飞机降落时间

        如果不是 ---> 新飞机无法正常降落

所以新飞机的结束时间  =  max(前飞机的结束时间, 新飞机到达时间) + 新飞机降落时间

根据博主的思路大家好好想想,将这个条件理解后,我们就可以来实现代码了。

读者可以先尝试写一下

这样就可以实现出这到题了

大家可以仔细理解一下。

4.八皇后

大家还是可以先自己做一下,看看有哪里不懂的。

接下来就跟着博主的思路来理一下这道题吧,我们看完这道题后,我们知道的是什么呢?

我们无非就是要往这个矩阵中填棋子,将解的个数输出即可。

我们对应的布局就如下面这样

对应的246135数字都为对应的1,2,3,4,5,6行对应的列

所以我们有了对应的数字246135就可以得到对应的棋局布置了

我们可以发现数据并不是很大,我们就可以去尝试枚举所有的情况了,将所有棋子的填充情况都枚举一遍不就解决了吗?

我们要填数肯定也有对应的限制了,那么限制是什么呢?

题目有说:行、列、对角线至多只能有一个棋子

所以我们通过这个条件就能够减少我们枚举的个数

我们简单画一下决策树来:

这里并没有画完,大概理解一下,我们只要遍历填充即可

大概逻辑还是dfs将结果存放起来

我们发现,其实要知道对应的行列有没有放棋子很简单的,由于放了1行,那么只能从2行开始放置了。所以我们只要用循环一行一行的放即可,我们再创建一个bool col[N]数组去标记哪些列被标记了。如果对应的列被放了就跳过它。

那么对角线如何解决呢?

我们可以使用一次函数来解决它。以向下的行数为x轴,向右的列为y轴,每个对角线都有自己的一个表达式:

我们对于一个坐标位置就有两条对角线:y - x = n     y + x = n

如果满足y - x = n或者y + x = n就代表对应的对角线已经有了棋子了!

我们只要将填过棋子的 y - x 和 y + x得到的值放在对应的数组就可以标记对角线了

但是有可能y - x会出现负数?怎么解决呢?

我们只要给y - x加上一个n值(偏移量)即可

现在bool  st[2 * N];就可以标记对角线了,而且由于每个节点会出现两条对角线,所以要空间要开辟2 * N的大小!

我们需要统计前几个结果的路径所以还得用vector<int> path去标记成功的结果。

现在我们就来写一下代码吧:

大家可以好好理解一下这段代码,再和博主我的思路画图结合一起来分析。

大家理解了其中的主要思维,就能够自己写出来了

5.数独

这道题题目讲的很简单给出一个未知的数独,然后让我们把它填完,再输出即可。

大家还是一样可以先自己思考一下该如何解决!

下面跟着博主的思路来看看这道题吧:

首先我们会接收到一个二维数组,这里面会有很多0,这些0就是我们需要去填充的部分

 对于每个0我们都可以在1---9的数字去填充

但是会因为其他已经有了数字的位置导致有些数不能填。

玩过数独的都知道,我们每行都是要在1-9去填充,3 * 3的格子内也得要在1--9

对于对应的行列,我们可以使用一个二维数组去标记第几行的哪几个数被填过,第几列的哪些数被填过。

bool row[N][N]  ----------   row[i][x]表示第x行的i数被填充过

bool col[N][N]   ----------   col[i][y]表示第y列的i数被填充过

那么对于这个3 * 3的格子怎么解决呢?

我们看看下面的图:

我们只要下标从 0 --- 8来标记数组,就可以通过对应的下标除以3就可以得到是第几个3 * 3的小格子

对应的这9 * 9的数独就有9个3 * 3的格子,就可以用对应点的x, y通过x / 3 , y / 3去找到对应的3 * 3格子

我们创建一个三维数组st来标记即可解决了

bool st[N][N][N]   -----   st[x / 3][y / 3][i] ---- 就代表第x / 3,行y / 3列的3 * 3格子中填充了数i

现在我们最困难的地方已经解决,现在就是写代码的阶段,读者可以跟着思路自己去写一下!

代码如下:

这道题中dfs里面还多出来了个判断y和x的合法性的判断,这个地方需要特别注意一下。

6.结语

很高兴大家能够看到这里,这一部分的题难度有所提高,大家要好好思考思考。

好好理解其中的思考过程,相信大家会有所收获的。

后面我会持续更新,大家多多点赞收藏+关注。

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

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

相关文章

蓝桥杯----AT24C02

&#xff08;5-1&#xff09;、AT24C02掉电不丢失写入与读取AT24C02就是将数据写入E2PROM&#xff0c;保证写入数据掉电不丢失。考频低&#xff0c;一般不考&#xff0c;顶天考几个数据E2PROM&#xff0c;上电立马读取。AT24C02数据读取一定放在主程序最前面&#xff0c;否则会…

【物联网】基于树莓派的物联网开发【19】——树莓派搭建MQTT客户端及MQTTX使用

场景介绍 实现测试客户端与 MQTT 服务器的连接、订阅、取消订阅、收发消息等功能。 MQTT发布消息到代理服务器 安装paho-mqtt 使用pip工具安装paho-mqtt&#xff0c;输入以下指令即可&#xff1a; sudo pip install paho-mqtt安装 MQTT 客户端库 为了方便连接到 MQTT 服务器&am…

5G-A技术浪潮勾勒通信产业新局,微美全息加快以“5.5G+ AI”新势能深化场景应用

7月31日&#xff0c;国家互联网信息办公室发布《国家信息化发展报告》。《报告》中提出&#xff0c;新一代通信技术研发取得新成果&#xff0c;5G-A地空通信&#xff08;5G-ATG&#xff09;技术研发成功并完成测试验证。5G-A技术研发测试验证移动通信技术一般代际生命周期为10年…

SQLite Where 子句详解

SQLite Where 子句详解 SQLite 是一款轻量级的数据库管理系统,广泛应用于移动设备、嵌入式系统以及个人电脑。在 SQLite 中,WHERE 子句是 SQL 查询语句中不可或缺的一部分,它用于指定查询条件,从而筛选出满足特定条件的记录。本文将详细介绍 SQLite 中的 WHERE 子句,包括…

AI IDE+AI 辅助编程-生成的大纲-一般般

引言概述 AI IDE 和 AI 辅助编程的兴起及其对开发效率的影响提出核心问题&#xff1a;AI 工具能否真正帮助程序员减少加班&#xff08;告别 996&#xff09;&#xff1f;AI IDE 与 AI 辅助编程的定义与现状解释 AI IDE&#xff08;集成 AI 的开发环境&#xff09;和 AI 辅助编程…

ABP VNext + Dapr Workflows:轻量级分布式工作流

&#x1f680; ABP VNext Dapr Workflows&#xff1a;轻量级分布式工作流 &#x1f4da; 目录&#x1f680; ABP VNext Dapr Workflows&#xff1a;轻量级分布式工作流一、引言 ✨TL;DR &#x1f525;二、环境与依赖 &#x1f6e0;️三、系统架构与流程图 &#x1f3d7;️四、…

⭐ Unity 实现UI视差滚动效果(Parallax)鼠标控制、可拓展陀螺仪与脚本控制

✨ 效果如下在许多游戏、APP 或动效页面中&#xff0c;我们常见的一种视觉效果是 视差滚动&#xff08;Parallax Scrolling&#xff09;&#xff1a;前景、中景、背景在鼠标或设备移动时以不同速率轻微移动&#xff0c;从而营造出一种空间感和深度感。目前遇到这样一个需求 所以…

【05】VM二次开发——模块参数配置--带渲染/不带渲染(WinForm界面调用 模块参数配置)

文章目录1 Winform 窗口界面 &#xff08;带渲染的参数配置控件&#xff09;2 配置代码3 运行测试4 不带渲染的参数配置控件 对比4.1 添加控件4.2 代码及演示效果模块参数配置本教程介绍如何在VM二次开发中对模块参数进行配置 1 Winform 窗口界面 &#xff08;带渲染的参数配置…

Android 之 蓝牙通信(2.0 经典)

​​一、环境配置​​1. ​​添加依赖​​在 build.gradle 中添加库依赖&#xff1a;dependencies {implementation com.github.akexorcist:bluetoothspp:1.0.0 }2. ​​权限声明&#xff08;AndroidManifest.xml&#xff09;​<uses-permission android:name"androi…

使用 Scikit-LLM 进行零样本和少样本分类

使用 Scikit-LLM 进行零样本和少样本分类 使用 Scikit-LLM 进行零样本和少样本分类 在本文中&#xff0c;您将学习&#xff1a; Scikit-LLM如何将OpenAI的GPT等大型语言模型与Scikit-learn框架集成以进行文本分析。零样本和少样本分类之间的区别以及如何使用Scikit-LLM实现它…

android内存作假通杀补丁(4GB作假8GB)

可过如下app检测&#xff1a; 安兔兔、鲁大师、白眼、AIDA64、CPU X、CPU-Z、DevCheck、DeviceInfoHW lyw235yk235:~/Extend/lyw235/V/sprdroid1_v_4/sprdroid1_v$ git diff vnd/bsp/kernel5.15/kernel5.15/mm/page_alloc.c diff --git a/vnd/bsp/kernel5.15/kernel5.15/mm/pag…

Android 之 MVC架构

介绍1. MVC架构分工​​​​Model层​​&#xff1a;处理数据验证、网络请求等业务逻辑。​​View层​​&#xff1a;XML布局定义界面&#xff0c;Activity处理用户输入和显示结果。​​Controller层​​&#xff1a;Activity作为控制器&#xff0c;协调Model和View的交互对于登…

Centos Docker 安装手册(可用)

Centos 安装 Docker # 卸载旧版 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine \docker-selinux # 安装依赖工具 yum install -y yum-utils device-mapper-persistent-d…

烽火HG680-KX-海思MV320芯片-2+8G-安卓9.0-强刷卡刷固件包

烽火HG680-KX-海思MV320芯片-28G-安卓9.0-强刷卡刷固件包U盘强刷刷机步骤&#xff1a;1、强刷刷机&#xff0c;用一个usb2.0的8G以下U盘&#xff0c;fat32&#xff0c;2048块单分区格式化&#xff08;强刷对&#xff35;盘非常非常挑剔&#xff0c;usb2.0的4G U盘兼容的多&…

Python爬虫实战:研究pycares技术构建DNS解析系统

1. 引言 1.1 研究背景 随着互联网的飞速发展,网络上的数据量呈现爆炸式增长。网络爬虫作为一种高效的数据采集工具,被广泛应用于数据分析、市场调研、学术研究等领域。传统的爬虫在进行大规模数据采集时,往往会受到 DNS 解析效率的制约,成为影响爬取性能的瓶颈之一。 DNS…

从 0 到 1 认识 Spring MVC:核心思想与基本用法(下)

文章目录&#x1f4d5;4. 响应✏️4.1 返回静态页面✏️4.2 返回数据ResponseBody​✏️4.3 返回HTML代码片段​✏️4.4 返回JSON✏️4.5 设置状态码✏️4.6 设置Header&#xff08;了解&#xff09;&#x1f4d5;5. 案例练习✏️5.1 加法计算器✏️5.2 用户登录✏️5.3 留言板…

Python-初学openCV——图像预处理(五)——梯度处理、边缘检测、图像轮廓

目录 一、图像梯度处理 1、垂直边缘提取 2、Sobel算子 3、Laplacian算子 二、图像边缘检测 1、高斯滤波 2、计算图像的梯度、方向 3、非极大值抑制 4、双阈值筛选 三、绘制图像轮廓 1、概念 2、寻找轮廓 3、绘制轮廓 一、图像梯度处理 还记得高数中的一阶导数求极值…

【Redis】安装Redis,通用命令,常用数据结构,单线程模型

目录 一.在Ubuntu系统安装Redis 二. redis客户端介绍 三. 全局命令 3.1.GET和SET命令 3.2.KEYS&#xff08;生产环境禁止使用&#xff09; 3.3.EXISTS 3.4.DEL 3.5.EXPIRE 3.6.TTL 3.6.1.Redis的过期策略 3.6.2.基于优先级队列/堆的实现去实现定时器 3.6.3.定时器&a…

ubuntu22.04系统实践 linux基础入门命令(三) 用户管理命令

以下有免费的4090云主机提供ubuntu22.04系统的其他入门实践操作 地址&#xff1a;星宇科技 | GPU服务器 高性能云主机 云服务器-登录 相关兑换码星宇社区---4090算力卡免费体验、共享开发社区-CSDN博客 之所以推荐给大家使用&#xff0c;是因为上面的云主机目前是免费使用的…

DPDK中的TCP头部处理

1. TCP头部结构 TCP头部通常为20字节&#xff08;不含可选字段&#xff09;&#xff0c;每个字段占据固定的字节位置。以下是TCP头部的结构&#xff0c;按字节位置逐一说明&#xff1a;0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 …