【数据结构与算法(十)】——回溯法

本文介绍了回溯法的原理,通过矩阵中的路径问题和机器人的运动范围两个实例来阐述解题思路。在矩阵路径问题中,从任意格子开始,按四个方向移动,避免重复进入格子,寻找特定字符串的路径。而在机器人的运动范围问题中,机器人在限制行和列坐标之和的方格内移动,避免重复计数。文章还探讨了C++中引用和指针的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BFS???

回溯法

用回溯法解决的问题的所有选项可以形象地用树状结构表示。在某一步有n个可能的选项,那么该步骤可以看成是树状结构的一个节点,每个选项看成树中节点连接线,经过这些连接线到达该节点的n个子节点。树的叶节点对应着终结状态。如果在叶节点的状态满足题目的约束条件,那么代表我们找到了一个可行的解决方案。如果叶节点的状态不满足约束条件,那么只好回溯到它的上一个节点再尝试其他选项。如果上一个系欸但所有可能的选项都已经试过了,并且不能满足到达约束条件的终结状态,则再次回溯到上一个节点。如果所有节点的所有选项都已经尝试过仍然不能到达满足约束条件的终结状态,则该问题无解。

题目

矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3*4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用下划线标出)。但矩阵中不包含字符串“abdb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子
这里写图片描述

思路:

以上矩阵从b开始的选项组成的树状结构
这里写图片描述
首先在矩阵中任选一个格子作为路径的起点。假设矩阵中某个格子的字符为ch,并且这个格子将对应于路径上的第i个字符。如果路径上的第i个字符不是ch,那么这个格子不可能处在路径上的第i个位置。如果路径上的第i+1个字符。除矩阵边界上的格子之外,其他格子都有相邻4个的格子。重复这个过程,直到路径上的所有字符都在矩阵中找到相应的位置。
回溯法具有递归特性,路径可以被看成一个栈。当在矩阵中定位了路径中前n个字符的位置之后,在与第n个字符对应的格子的周围都没有找到第n+1个字符,这时候只好在路径上回到第n-1个字符,重新定位第n个字符。
由于路径不能重复进入矩阵的格子,所以还需要定义和字符矩阵大小一样的布尔值矩阵,用来标识路径是否已经进入了每个格子。

#include<string>
//使用引用作为函数的返回值,函数执行完,返回的是引用,可以引向的是很大的数据内存区,可以更有效解决
bool hasPathCore(char* matrix, int rows, int cols, int row, int col, const char* str, int& pathLength, bool* isVisited)
{
    //说明已经到达路径的出口了
    if (str[pathLength] == '\0')
        return true;

    bool hasPath = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值