回溯法

  回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。

  回溯法的基本行为是搜索,搜索过程使用剪枝函数来为了避免无效的搜索。剪枝函数包括两类:1. 使用约束函数,剪去不满足约束条件的路径;2.使用限界函数,剪去不能得到最优解的路径。(以上引他人的)

实现方法有两种:递归和递推(也称迭代)。

递归:程序调用自己的编程技巧叫做递归。

递推:递推算法是一种用若干步可重复的简运算(规律)来描述复杂问题的方法。比如使用while

迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,

而每一次迭代得到的结果会作为下一次迭代的初始值。


本例采用递归

【题目】请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。

例如 

a b c e 

s  f c s 

a d e e 
矩阵中包含一条字符串”bccced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。(来源于剑指offer)


额外:输出路径

示例代码:

#include 
    
    
     
     
#include 
     
     
      
      
#include
      
      
       
       
using namespace std;
queue
       
       
        
        q,p;
bool findcore(char *matrix,bool* vis,int row,int col,int r,int c,int posit,string str)
{
    if(posit==str.size())
        return true ;
    bool haspath=false;
    if(r>=0&&c>=0&&r
        
        
       
       
      
      
     
     
    
    


结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值