当前位置:  编程技术>c/c++/嵌入式

C++回溯法实例分析

    来源: 互联网  发布时间:2014-10-29

    本文导语:  本文实例讲述了C++的回溯法,分享给大家供大家参考之用。具体方法分析如下: 一般来说,回溯法是一种枚举状态空间中所有可能状态的系统方法,它是一个一般性的算法框架。 解向量a=(a1, a2, ..., an),其中每个元素ai取自一...

本文实例讲述了C++的回溯法,分享给大家供大家参考之用。具体方法分析如下:

一般来说,回溯法是一种枚举状态空间中所有可能状态的系统方法,它是一个一般性的算法框架。

解向量a=(a1, a2, ..., an),其中每个元素ai取自一个有限序列集Si,这样的解向量可以表示一个排列,其中ai是排列中的第i个元素,也可以表示子集S,其中ai为真当且仅当全集中的第i个元素在S中;甚至可以表示游戏的行动序列或者图中的路径。

在回溯法的每一步,我们从一个给定的部分解a={a1, a2, ..., ak}开始,尝试在最后添加元素来扩展这个部分解,扩展之后,我们必须测试它是否为一个完整解,如果是的话,就输出这个解;如果不完整,我们必须检查这个部分解是否仍有可能扩展成完整解,如果有可能,递归下去;如果没可能,从a中删除新加入的最后一个元素,然后尝试该位置上的其他可能性。

用一个全局变量来控制回溯是否完成,这个变量设为finished,那么回溯框架如下,可谓是回溯大法之精髓与神器

bool finished = false;

void backTack(int input[], int inputSize, int index, int states[], int stateSize)
{
 int candidates[MAXCANDIDATE];
 int ncandidates;

 if (isSolution(input, inputSize, index) == true)
 {
 processSolution(input, inputSize, index);
 }
 else
 {
 constructCandidate(input, inputSize, index, candidates, &ncandidates);
 for (int i = 0; i < ncandidates; i++)
 {
  input[index] = candidates[i];
  backTack(input, inputSize, index + 1);
  if (finished)
  return;
 }
 }
}

不拘泥于框架的形式,我们可以编写出如下代码:

#include 

using namespace std;

char str[] = "abc";
const int size = 3;

int constructCandidate(bool *flag, int size = 2)
{
 flag[0] = true;
 flag[1] = false;

 return 2;
}

void printCombine(const char *str, bool *flag, int pos, int size)
{
 if (str == NULL || flag == NULL || size 

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3