回溯算法--总结与例题整理

本文从以下几个方面对回溯算法进行总结:

1、什么是回溯算法

2、回溯算法与穷举法的区别与联系

3、回溯算法的解题步骤(准备工作、解题步骤、递归方法的参数选择)

4、例题:LeetCode-39 组合总和、LeetCode-40 组合总和Ⅱ

5、例题整理

一、什么是回溯算法

        回溯算法(百度百科)实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

二、回溯算法与穷举法的区别与联系

        回溯法与穷举法有某些联系,它们都是基于试探的,但是回溯算法是优于穷举法的。穷举法要将一个解的各个部分全部生成后,才检查是否满足条件,若不满足,则直接放弃该完整解,然后再尝试另一个可能的完整解,它并没有沿着一个可能的完整解的各个部分逐步回退生成解的过程。而对于回溯法,一个解的各个部分是逐步生成的,当发现当前生成的某部分不满足约束条件时,就放弃该步所做的工作,退到上一步进行新的尝试,而不是放弃整个解重来。(所谓剪枝,也就是避免了一些不必要的搜索)

三、回溯算法的解题步骤

准备工作:

1)由于采用回溯法求解时存在退回到祖先结点的过程,所以需要保存搜索过的结点。

      通常有两种方法:1、用子定义栈来保存;2、采用递归方法。

2)用回溯法通常采用两种策略避免无效搜索。这两类函数统称为剪枝函数

      1、用约束函数在扩展结点处剪除不满足约束条件的路径;

      2、用限界函数剪去得不到问题的解或最优解的路径。

3)要保证递归函数返回 或 弹出栈顶元素 后,状态可以恢复到操作前,以此达到真正的回溯。

 

回溯法求解的一般步

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Cohen-Sutherland裁剪算法是一种常用的线段裁剪算法,用于将线段裁剪为可见部分。下面是一个例题: 假设有一条线段P1(2,3)到P2(8,9),裁剪窗口为左下角为(4,4),右上角为(10,10),请使用Cohen-Sutherland裁剪算法将该线段裁剪为可见部分。 解题思路: 1. 将线段的两个端点P1和P2分别进行编码,得到它们的区域码。 2. 判断线段是否完全在裁剪窗口内部,如果是,则直接输出该线段;如果不是,则进行下一步。 3. 判断线段是否完全在裁剪窗口外部,如果是,则直接舍弃该线段;如果不是,则进行下一步。 4. 对于线段的每个端点,判断它是否与裁剪窗口的边界相交,如果是,则计算出交点,并将该点作为新的端点,重新编码。 5. 重复步骤1-4,直到线段被裁剪为可见部分。 根据上述思路,可以得到以下步骤: 1. 对于端点P1和P2,分别计算它们的区域码: P1(2,3)的区域码为:0001(左下角为1,右下角为,右上角为,左上角为1) P2(8,9)的区域码为:100(左下角为,右下角为,右上角为1,左上角为) 2. 判断线段是否完全在裁剪窗口内部。由于P1和P2的区域码都不为000,因此线段不完全在裁剪窗口内部。 3. 判断线段是否完全在裁剪窗口外部。由于P1和P2的区域码都不为000,因此线段不完全在裁剪窗口外部。 4. 对于端点P1和P2,判断它们是否与裁剪窗口的边界相交。由于P1的区域码的左上角为1,因此P1与裁剪窗口的左边界相交。计算出交点P3(4,5),并将P3作为新的端点P1,重新计算它的区域码: P1(4,5)的区域码为:001(左下角为,右下角为,右上角为1,左上角为) 由于P2的区域码的右上角为1,因此P2与裁剪窗口的上边界相交。计算出交点P4(9,10),并将P4作为新的端点P2,重新计算它的区域码: P2(9,10)的区域码为:101(左下角为,右下角为,右上角为1,左上角为) 5. 重复步骤1-4,直到线段被裁剪为可见部分。由于P1和P2的区域码都为000,因此线段已被裁剪为可见部分,输出裁剪后的线段P3(4,5)到P4(9,10)。 ### 回答2: Cohen-Sutherland裁剪算法是一种常见的计算机图像学算法,用于将一个图形裁剪在一个矩形区域内。Cohen-Sutherland裁剪算法可以运用于二维图形裁剪,在三维图形裁剪和多边形裁剪中也有应用。 下面,我们用一个例题来介绍Cohen-Sutherland裁剪算法。 假设有一条线段P1P2,它的起始点P1坐标为(30, 10),终止点P2坐标为(90, 60)。现在需要将这条线段裁剪在一个矩形区域内,该矩形区域左下角坐标为(40, 20),右上角坐标为(80, 50)。 那么,我们可以根据Cohen-Sutherland裁剪算法的步骤进行计算。 第一步:计算起始点P1和终止点P2的区域码。 区域码是用二进制位表示的特定编码,用于确定一个点在矩形区域的哪个位置。区域码通常由上下左右四个方向构成,每个方向表示该点在矩形区域的哪一侧。我们可以采用下面的规则来计算区域码: UP: 0001 DOWN: 0010 LEFT: 0100 RIGHT: 1000 对于点P1,它的区域码为:0101(左上角和右侧)。对于点P2,它的区域码为:1010(右下角和左侧)。 第二步:判断线段是否完全在矩形区域内。 根据区域码,我们可以判断起始点P1和终止点P2是否都在矩形区域内。如果两个点的区域码都为0000,则表示两个点都在矩形区域内;如果两个点的区域码为非0000,则表示两个点不在矩形区域内;否则,表示两个点有一个在矩形区域内,一个在矩形区域外。 对于该例题,由于点P1的区域码为0101,点P2的区域码为1010,两个点都在矩形区域外,因此需要进行裁剪。 第三步:寻找线段与矩形边界的交点。 根据区域码,我们可以知道线段与矩形边界的相对位置。现在需要找到线段与矩形边界的交点,并更新线段的起始点和终止点。具体的交点计算方法如下: 对于点P1: 1. 如果区域码中UP位为1,则交点的y值为矩形上边界的y值; 2. 如果区域码中DOWN位为1,则交点的y值为矩形下边界的y值; 3. 如果区域码中LEFT位为1,则交点的x值为矩形左边界的x值; 4. 如果区域码中RIGHT位为1,则交点的x值为矩形右边界的x值; 对于点P2: 1. 如果区域码中UP位为1,则交点的y值为矩形上边界的y值; 2. 如果区域码中DOWN位为1,则交点的y值为矩形下边界的y值; 3. 如果区域码中LEFT位为1,则交点的x值为矩形左边界的x值; 4. 如果区域码中RIGHT位为1,则交点的x值为矩形右边界的y值。 对于该例题,可以分别找到线段与矩形上边界和左边界的交点,交点分别为(55, 20)和(40, 25)。于是,将线段起始点更新为(55, 20),终止点更新为(40,25)。 第四步:重复第二步和第三步,直到线段完全位于矩形内部。 对于该例题,我们需要再次计算起始点P1和终止点P2的区域码。此时,起始点P1的区域码为0001,终止点P2的区域码为0100,表示两个点都在矩形区域内,因此,线段已经裁剪完成。 综上,该例题通过Cohen-Sutherland裁剪算法得到裁剪后的线段起始点为(55, 20),终止点为(40,25)。 ### 回答3: Cohen-Sutherland裁剪算法是一种常用于计算机图形学中的直线裁剪算法。它是由Cohen和Sutherland于1967年提出的。 Cohen-Sutherland裁剪算法的基本思想是将裁剪区域分为九个部分,用二进制码表示每个点在哪些区域。然后根据二进制码的判断结果,决定哪些线段需要裁剪。如果两个点都在裁剪区域内,则线段完全在裁剪区域内;如果两个点都在裁剪区域外,则线段完全在裁剪区域外;如果两个点一个在裁剪区域内,一个在裁剪区域外,那么需要将线段裁剪成两部分,只保留在裁剪区域内的部分。 下面我们来看一个例题: 给定一个线段P1(10, 20), P2(40, 50)和一个裁剪区域left = 15, right = 35, bottom = 25, top = 45。使用Cohen-Sutherland算法进行裁剪。 首先,我们需要确定P1和P2的区域码。P1的区域码为0101(左侧的外部区域和下方的内部区域),P2的区域码为1011(右侧的内部区域、上方的内部区域和左上角的外部区域)。 然后,我们需要判断这条线段是否需要进行裁剪。因为P1和P2的区域码都不是0000,也不是1111,所以线段需要进行裁剪。 接下来,我们需要找到线段和裁剪区域的交点。从P1出发,我们可以先判断线段和裁剪区域left的交点。由于P1的区域码的第3位是0,表明P1在裁剪区域左侧外部区域,而裁剪区域left在P1的右侧内部区域,所以线段与裁剪区域left相交。我们可以根据斜率计算出交点为(15, 32.5)。再从P2出发,我们也可以找到线段和裁剪区域right、top和bottom的交点。交点分别为(35, 42.5)、(26.67, 45)和(33.33, 25)。 最后,我们根据交点重新组合线段,得到裁剪后的线段为P1(15, 32.5), P2(35, 42.5)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值