递归、搜索与回溯算法:综合练习

news2025/1/18 9:48:07

例题一

解法:
算法思路:
⾸先,我们在第⼀⾏放置第⼀个皇后,然后遍历棋盘的第⼆⾏,在可⾏的位置放置第⼆个皇后,然后再遍历第三⾏,在可⾏的位置放置第三个皇后,以此类推,直到放置了 n 个皇后为⽌。
我们需要⽤⼀个数组来记录每⼀⾏放置的皇后的列数。在每⼀⾏中,我们尝试放置⼀个皇后,并检查是否会和前⾯已经放置的皇后冲突。如果没有冲突,我们就继续递归地放置下⼀⾏的皇后,直到所有的皇后都放置完毕,然后把这个⽅案记录下来。
在检查皇后是否冲突时,我们可以⽤⼀个数组来记录每⼀列是否已经放置了皇后,并检查当前要放置的皇后是否会和已经放置的皇后冲突。对于对⻆线,我们可以⽤两个数组来记录从左上⻆到右下⻆的每⼀条对⻆线上是否已经放置了皇后,以及从右上⻆到左下⻆的每⼀条对⻆线上是否已经放置了皇后。
对于对⻆线是否冲突的判断可以通过以下流程解决:
1. 从左上到右下:相同对⻆线的⾏列之差相同;
2. 从右上到左下:相同对⻆线的⾏列之和相同。
因此,我们需要创建⽤于存储解决⽅案的⼆维字符串数组 ret  ,⽤于存储每个皇后的位置的
⼀维整数数组 path ,以及⽤于记录每⼀列和对⻆线上是否已经有皇后的布尔型数组
checkcol  、 checkdiag1 和 check diag2
全局变量:
vector<vector<string>> ret;
vector<string> path;
int _n;
vector<bool> checkcol;
vector<bool> checkdiag1, checkdiag2;
递归函数设计:void dfs(int pos)
参数:row(当前需要处理的⾏数);
返回值:⽆;
函数作⽤:在当前⾏放⼊⼀个不发⽣冲突的皇后,查找所有可⾏的⽅案使得放置 n 个皇后后不发⽣冲突。
递归函数流程如下:
1. 结束条件:如果 row 等于 n ,则表⽰已经找到⼀组解决⽅案,此时将每个皇后的位置存储到字
符串数组 path  中,并将 path   存储到 ret   数组中,然后返回;
2. 枚举当前⾏的每⼀列,判断该列、两个对⻆线上是否已经有皇后:
a. 如果有皇后,则继续枚举下⼀列;
b. 否则,在该位置放置皇后,并将 checkcol  、 checkdiag1 和 check diag2 对应的位置设为 true ,表⽰该列和对⻆线上已经有皇后:
i. 递归调⽤ dfs 函数,搜索下⼀⾏的皇后位置。如果该⽅案递归结束,则在回溯时需要将 checkcol  、 checkdiag1 和 check diag2 对应的位置设为 false ,然后继续枚举下⼀列;

例题二

解法:
算法思路:
创建三个数组标记⾏、列以及 3*3 ⼩⽅格中是否出现 1~9 之间的数字即可。

例题三

解法:
算法思路:
为了存储每个位置的元素,我们需要定义⼀个⼆维数组。⾸先,我们记录所有已知的数据,然后遍历所有需要处理的位置,并遍历数字 1~9。对于每个位置,我们检查该数字是否可以存放在该位置,同时检查⾏、列和九宫格是否唯⼀。
我们可以使⽤⼀个⼆维数组来记录每个数字在每⼀⾏中是否出现,⼀个⼆维数组来记录每个数字在每⼀列中是否出现。对于九宫格,我们可以以⾏和列除以 3 得到的商作为九宫格的坐标,并使⽤⼀个三维数组来记录每个数字在每⼀个九宫格中是否出现。在检查是否存在冲突时,只需检查⾏、列和九宫格⾥对应的数字是否已被标记。如果数字⾄少有⼀个位置(⾏、列、九宫格)被标记,则存在冲突,因此不能在该位置放置当前数字。
特别地,在本题中,我们需要直接修改给出的数组,因此在找到⼀种可⾏的⽅法时,应该停⽌递归,以防⽌正确的⽅法被覆盖。
初始化定义:
1. 定义⾏、列、九宫格标记数组以及找到可⾏⽅法的标记变量,将它们初始化为 false。
2. 定义⼀个数组来存储每个需要处理的位置。
3. 将题⽬给出的所有元素的⾏、列以及九宫格坐标标记为 true。
4. 将所有需要处理的位置存⼊数组。
递归函数设计:void dfs(vector<vector<char>>& board)
参数:无;
返回值:⽆;
函数作⽤:在当前坐标填⼊合适数字,查找数独答案。
递归流程如下:
1. 结束条件:已经处理完所有需要处理的元素。如果找到了可⾏的解决⽅案,则将标记变量更新为
true 并返回。
2. 获取当前需要处理的元素的⾏列值。
3. 遍历数字 1~9。如果当前数字可以填⼊当前位置,并且标记变量未被赋值为 true,则将当前位置的⾏、列以及九宫格坐标标记为 true,将当前数字赋值给 board 数组中的相应位置元素,然后对下⼀个位置进⾏递归。
4. 递归结束时,撤回标记。

例题四

解法:
算法思路:
我们需要假设每个位置的元素作为第⼀个字⺟,然后向相邻的四个⽅向进⾏递归,并且不能出现重复使⽤同⼀个位置的元素。通过深度优先搜索的⽅式,不断地枚举相邻元素作为下⼀个字⺟出现的可能性,并在递归结束时回溯,直到枚举完所有可能性,得到正确的结果。
递归函数设计:bool dfs(vector<vector<char>>& board,int i,int j,string& word,int pos)
参数:i(当前需要进⾏处理的元素横坐标),j(当前需要进⾏处理的元素横坐标),pos(当前已
经处理的元素个数),word(字符串);
函数作⽤:判断当前坐标的元素作为字符串中下标 pos 的元素出现时,向四个⽅向传递,查找是否存在路径结果与字符串相同。
递归函数流程:
1. 遍历每个位置,标记当前位置并将当前位置的字⺟作为⾸字⺟进⾏递归,并且在回溯时撤回记。
2. 在每个递归的状态中,我们维护⼀个步数 pos,表⽰当前已经处理了⼏个字⺟。
若当前 pos 的值与字符串⻓度相等,表⽰存在⼀种路径使得 word 成⽴,返回 true。
3. 对当前位置的上下左右四个相邻位置进⾏递归,若递归结果为 true,则返回 true。
4. 若相邻的四个位置的递归结果都为 false,则返回 false。
特别地,如果使⽤将当前遍历到的字符赋值为空格,并在回溯时恢复为原来的字⺟的⽅法,则在递归时不会重复遍历当前元素,可达到不使⽤标记数组的⽬的。

例题五

解法:
算法思路:
枚举矩阵中所有的位置当成起点,来⼀次深度优先遍历,统计出所有情况下能收集到的⻩⾦数的最⼤值即可。

例题六

解法:
算法思路:
对于四个⽅向,我们可以定义两个一维数组 dx,dy ,⼤⼩为 4 ,每⼀维存储四个⽅向的坐标偏移量 (详⻅代码)。题⽬要求到达⽬标位置时所有⽆障碍⽅格都存在路径中,我们可以定义⼀个变量记录 num 当前状态中剩余的未⾛过的⽆障碍⽅格个数,则当我们⾛到⽬标地点时只需要判断 num 是否为 0 即可。在移动时需要判断是否越界。
全局变量:
vector<vector<bool>> visited;
int m, n;
int ret,cou=0;
int dx[4] = { 0,0,1,-1 }, dy[4] = { 1,-1,0,0 };
递归函数设计:void dfs(vector<vector<int>>& grid,int i,int j,int path)
参数:i,j(当前需要处理元素的坐标),path(当前行走的步数);
返回值:⽆;
函数作⽤:判断当前位置的四个⽅向是否可以添加⾄当前状态,查找在满⾜条件下从起始⽅格到结束⽅格的不同路径的数⽬。
递归流程如下:
1. 递归结束条件:当前位置的元素值为 2,若此时已经⾛的位置数量 path 的值为 cou,则 ret 的值加⼀;
2. 遍历四个⽅向,若移动后未越界,⽆障碍并且未被标记,则标记当前位置,并递归移动后的位置,在回溯时撤销标记操作。

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

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

相关文章

鸿蒙OpenHarmony【集成三方SDK】 (基于Hi3861开发板)

OpenHarmony致力于打造一套更加开放完善的IoT生态系统&#xff0c;为此OpenHarmony规划了一组目录&#xff0c;用于将各厂商的SDK集成到OpenHarmony中。本文档基于Hi3861开发板&#xff0c;向平台开发者介绍将SDK集成到OpenHarmony的方法。 规划目录结构 三方SDK通常由静态库…

2024年4月最新注册香港苹果账号(Apple ID)并解决支付的教程

大陆的Apple ID仅仅能下载国内的一些APP&#xff0c;其实海外也有非常之多好用又好玩的APP需要大家来挖掘!发现这些海外优质APP就得需要一个海外苹果账号。这就是我今天为什么要写这篇文章的初衷! 注册香港Apple ID教程 1、首先到http://appleid.apple.com里注册一个国内的Ap…

ROS2 命令行工具---常用命令整理

本文主要介绍 ROS2 机器人操作系统的一些常用命令行工具及其使用方法&#xff0c;使用这些命令可以使机器人编程和调试变得更加简便。 在实际应用过程中&#xff0c;我们会经常用到命令行操作来辅助调试&#xff0c;更进一步的可以使用GUI工具辅助调试。 一、创建工作空间 跟…

数据结构——第7章 查找

1 线性表的查找 数据元素和顺序表的定义 typedef struct{KeyType key;InfoType otherinfo; }ElemType; typedef struct{ElemType *R;int length; }SSTable; 1.1 顺序查找 int Search_Seq(SSTable ST,KeyType key){ST.R[0].keykey;for(int iST.length;ST.R[i].key!key;i--);…

SQLAlchemy的使用

SQLAlchemy中filter函数的使用 https://blog.csdn.net/m0_67093160/article/details/133318889 创建临时字段 select id , CONCAT(‘内容’) AS fullname from example_table; Pandas数据类型转换_pandas转换数据类型 https://blog.csdn.net/qq_41404557/article/details/125…

用wps自带工具给图片做标注

在wps中&#xff0c;选中wps中的图片&#xff0c;右键选择【编辑】进入图片编辑器&#xff0c;在选项卡面板右侧选择【标注】工具&#xff0c;再选择【添加文本】工具&#xff0c;即可直接在图片上输入文字&#xff0c;标注完成后选择【覆盖原图】就完成标注任务。

【3200字干货】2024跨境电商5大市场:选品风向深度剖析

以下是针对马来西亚、新加坡、泰国、菲律宾和台湾这5个东南亚跨境电商市场的选品市场分析&#xff1a; 一、马来西亚 市场特点&#xff1a;马来西亚是东南亚第三大经济体&#xff0c;拥有年轻的消费群体和对跨境购物的偏好。网购消费力强&#xff0c;易上手爆单&#xff0c;跨…

tableau基础学习——添加标靶图、甘特图、瀑布图

标靶图 添加参考线 添加参考分布 甘特图 创建新的字段 如设置延迟天数****计划交货日期-实际交货日期 为正代表提前交货&#xff0c;负则代表延迟交货 步骤&#xff1a;创建——计算新字段 把延迟天数放在颜色、大小里面就可以 瀑布图 两个表按照地区连接 先做个条形图&…

Python构建学生信息管理系统:网站路由补充和首次运行

在之前的内容中&#xff0c;我们已经完成了学生信息管理系统&#xff08;Student Information Management System, SIMS&#xff09;的需求分析、环境搭建、数据库创建、项目结构的初始化&#xff0c;以及运行。正常做下来的朋友&#xff0c;会发现项目运行后输入http://127.0.…

vscode在json文件中添加注释

1.在设置中输入关联文件&#xff0c;点击添加项&#xff1b; 2.

ClickHouse 24.3 版本发布说明

本文字数&#xff1a;10774&#xff1b;估计阅读时间&#xff1a;27 分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 北半球迎来春天&#xff0c;也是 ClickHouse 发布新版本的时候了。 发布概要 本次ClickHouse 24.3版本包含了1…

Android 系统充电动画

效果 Android获取电池充电状态是否为快充可参考. Android_source/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java private int lastBatteryStatus;private final BroadcastReceiver mBatteryChangedReceiver new BroadcastRece…

ComfyUI学习旅程

一、模型文件&#xff08;Checkpoint&#xff09; 首先它很大&#xff0c;这些文件是你从huggingface或者civitai下载而来的&#xff0c; 所以这些大文件如 .ckpt 或 .safetensors &#xff0c;实际上包含了什么内容呢&#xff1f; 它包含了包含了三种不同模型的权重&#x…

【STM32F4】STM32CUMX相关环境配置

一、环境配置 我们需要以下两个软件 &#xff08;一&#xff09;keil5 最正统&#xff0c;最经典的嵌入式MCU开发环境。 该环境的配置可以看看之前的文章 所需文件如下&#xff1a; 当时配置的是STC8H的环境&#xff0c;现在基于此&#xff0c;重新给STM32配置环境。能让STC…

docker的默认路径存储不足

docker的默认路径存储不足 添加磁盘 [rootlocalhost ~]# fdisk -l磁盘 /dev/sda&#xff1a;42.9 GB, 42949672960 字节&#xff0c;83886080 个扇区 Units 扇区 of 1 * 512 512 bytes 扇区大小(逻辑/物理)&#xff1a;512 字节 / 512 字节 I/O 大小(最小/最佳)&#xff1a…

【网络安全】网络安全协议和防火墙

目录 1、网络层的安全协议&#xff1a;IPsec 协议族 &#xff08;1&#xff09;IP 安全数据报格式 &#xff08;2&#xff09;互联网密钥交换 IKE (Internet Key Exchange) 协议 2、运输层的安全协议&#xff1a;TLS 协议 3、系统安全&#xff1a;防火墙与入侵检测 1、网络…

CJSON工具类

4.4.3.CJSON工具类 OpenResty提供了一个cjson的模块用来处理JSON的序列化和反序列化。 官方地址&#xff1a; https://github.com/openresty/lua-cjson/ 1&#xff09;引入cjson模块&#xff1a; local cjson require "cjson"2&#xff09;序列化&#xff1a; …

pwn--realloc [CISCN 2019东南]PWN5

首先学习一下realloc这个函数&#xff0c;以下是文心一言的解释&#xff1a; realloc是C语言库函数之一&#xff0c;用于重新分配内存空间。它的主要功能是调整一块内存空间的大小。当需要增加内存空间时&#xff0c;realloc会分配一个新的更大的内存块&#xff0c;然后将原内…

19 使用MapReduce编程统计超市1月商品被购买的次数

首先将1月份的订单数据上传到HDFS上&#xff0c;订单数据格式 ID Goods两个数据字段构成 将订单数据保存在order.txt中&#xff0c;&#xff08;上传前记得启动集群&#xff09;。 打开Idea创建项目 修改pom.xml&#xff0c;添加依赖 <dependencies><dependency>…

多客圈子交友系统 uniapp+thinkphp6适配小程序/H5/app/api全开源,多款插件自选,支持个性定制!

网上交友的优点包括&#xff1a; 1. 方便&#xff1a;网上交友可以随时随地进行&#xff0c;不受时间和空间的限制&#xff0c;方便且高效。 2. 匿名性&#xff1a;网上交友可以实现匿名性&#xff0c;用户可以匿名地搜索、聊天或交换信息&#xff0c;保护个人隐私和安全。 3.…