C++回溯算法深度优先搜索的示例分析


小编给大家分享一下C++回溯算法深度优先搜索的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!假如有编号为1~ 3的3张扑克牌和编号为1~3的3个盒子,现在需要将3张牌分别放到3个盒子中去,且每个盒子只能放一张牌,一共有多少种不同的放法。解题思路:假定按照牌面值从小到大依次尝试,即将1号牌放入第一个盒子中。按此顺序继续向后走,放完第三个盒子时,手中的牌也已经用完,再继续往后则到了盒子的尽头。此时一种放法已经完成了,即这条路走到了尽头,需要折返,重新回到上一个盒子。这里回到第三个盒子,把第三个盒子中的牌回收,再去尝试能否放其它的牌。但这时手里只有一张3号牌,所以需要继续向后回退,到2号盒子。按照上述步骤依次会产生所有结果。 用一个数组book标记手里是否有这张牌。Dfs(当前这一步的处理逻辑)
{
1. 判断边界,是否已经一条道走到黑了:向上回退
2. 尝试当下的每一种可能
3. 确定一种可能之后,继续下一步 Dfs(下一步)
}代码实现:问题描述:给定一个保存员工信息的数据结构,它包含了员工 唯一的 id ,重要度 和 直系下属的 id 。 比如,员工 1 是员工 2 的领导,员工 2 是员工 3 的领导。他们相应的重要度为 15 , 10 , 5 。那么员工 1 的数据结构是 [1, 15, [2]] ,员工 2的 数据结构是 [2, 10, [3]] ,员工 3 的数据结构是 [3, 5, []] 。注意虽然员工 3 也是员工 1 的一个下属,但是由于 并不是直系 下属,因此没有体现在员工 1 的数据结构中。现在输入一个公司的所有员工信息,以及单个员工 id ,返回这个员工和他所有下属的重要度之和。解题思路:边界:下属为空每次先加第一个下属的重要性按照相同的操作再去加下属的第一个下属的重要性。代码实现:问题描述:有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。 为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。最后返回经过上色渲染后的图像。解题思路:从所给坐标开始,向上下左右四个方向渲染,只要渲染点的颜色值和原坐标相同,则继续向外渲染。 边界:位置是否越界。这里需要用标记避免重复修改,使时间复杂度不超过O(row*col)代码实现:问题描述:给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。解题思路: 从每个边缘的O开始,只要和边缘的O连通,则它就没有被包围。1.首先寻找边上的每一个O,如果没有,表示所有的O都被包围。2.对于边上的每一个O进行dfs扩散,先把边上的每一个O用特殊符号标记(除了X和O以外)。把和它相邻的O都替换为特殊符号,每一个新的位置都做相同的dfs操作。3.所有扩散结束之后,把特殊符号的位置(和边界连通)还原为O,原来为O的位置(和边界不连通)替换为X即可。代码实现:问题描述:给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [ [“1”,“1”,“1”,“1”,“0”], [“1”,“1”,“0”,“1”,“0”], [“1”,“1”,“0”,“0”,“0”], [“0”,“0”,“0”,“0”,“0”] ]输出:1解题思路:本题可以采用类似渲染的做法,尝试以每个点作为渲染的起点,可以渲染的陆地都算作一个岛屿,最后看渲染了多少次,即深度优先算法执行了多少次,就是岛屿的数量。代码实现:问题描述:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺免费云主机域名序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。解题思路:首先使用数组(也可使用哈希表)存储每个数字对应的所有可能的字母,然后进行回溯操作。回溯算法用于寻找所有的可行解,如果发现一个解不可行,则会舍弃不可行的解。在这道题中,由于每个数字对应的每个字母都可能进入字母组合,因此不存在不可行的解,直接穷举所有的解即可。代码实现:问题描述:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。输入:candidates = [2,3,6,7], target = 7输出:[[2,2,3],[7]]解题思路:此题相加的元素可以重复,所以去下一个元素的位置可以从当前位置开始,DFS+回溯。为了保证组合不重复(顺序不同,元素相同,也算重复),不再从当前位置向前看。1.从第一个元素开始相加2.让局部和继续累加候选的剩余值3.局部和等于目标值,保存组合,向上回退,寻找其它组合代码实现:问题描述:你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。注意:本题中,每个活字字模只能使用一次。示例 1:输入:“AAB”输出:8解释:可能的序列为 “A”, “B”, “AA”, “AB”, “BA”, “AAB”, “ABA”, “BAA”。解题思路:此题组合的长度不唯一,最小组合长度为1,最大组合长度为tiles的长度。按照题意tiles中每一个位置的字符在组合中只能出现一次,所以可以用一个标记辅助。当组合新的组合时,可以与tiles种的每一个位置组合,但是如果当前位置已经在当前组合中出现过,则跳过。虽然此题种每一个位置的字符在组合中只能出现一次,但是tiles中可能有相同的字符,所以需要考虑重复的组合。而用unordered_set可以天然去重。DFS+回溯:1.当前组合不为空,则插入set中2.继续给当前组合拼接新的组合,尝试拼接tiles每一个位置的字符3.如果当前位置已经在组合中出现过,返回到2,否则标记当前位置,继续拼接更长的组合4.回溯,尝试组合其它位置,返回2当所有位置都已经使用过时,当前递归就结束了,继续向上层DFS回退最终返回set大小即为组合数目代码实现:问题描述:n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。解题思路:DFS+回溯从第一行开始放置皇后,每确定一个位置,判断是否/p>

相关推荐: Java怎么使用责任链默认优雅地进行参数校验

本篇内容介绍了“Java怎么使用责任链默认优雅地进行参数校验”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!项目中参数校验十分重要,它可以保护我们应用程序的安全性…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 07/21 10:15
Next 07/21 10:15

相关推荐