回溯法

来源:互联网 发布:上升三法选股公式源码 编辑:程序博客网 时间:2024/05/21 21:01

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

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

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

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

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

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

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


本例采用递归

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

例如 

a b c e 

s  f c s 

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


额外:输出路径

示例代码:

#include #include #includeusing namespace std;queueq,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


结果:


原创粉丝点击