回溯' AABC' C ++中的字符串

时间:2018-03-25 11:50:47

标签: c++ recursion backtracking

我正努力在C ++中解决这个问题。 我有一个字符串:{A,A,B,C},我想为此打印所有可能的排列。 这将是12: AABC,AACB,ABAC,ABCA等......

我已经编写了以下代码: - 包含字母A,A,B,C的字符串。 - 一个结果字符串,我将在其中填充递归基本条件时打印每个排列 - 一个整数数组,表示每个数字的计数器值:计数器[3] = {2,1,1},这意味着在排列中可以有2个A,1个B和1C。 - 一个应该以递归方式解决问题的函数:

从初始字符串开始。从字符串的左侧到右侧检查每个字符的计数器是否大于0.如果将字符放在result [lvl]中,其中lvl是递归的深度。然后递减该角色位置的计数器。对当前元素右侧的所有元素执行此操作,然后一直向后回溯并从下一个元素开始(第二个A)。 基本情况是当所有计数器等于0时打印解决方案然后返回。

以下是代码:

#include <iostream>

using namespace std;

char theString[4] = {'A','A','B','C'};
char resultString[4]={};

int counters[3] = {2,1,1};


void printPermutation()
{
 for(int i=0; i<4; i++)
 {
  cout << resultString[i];
 }
 cout << endl;
}



void solvePermutations(int *counters, int lvl)
{
  if(lvl == 4)
  {
   printPermutation();
   return;
  }

  for(int i=0; i<4; i++)
  {
   if(counters[i] == 0)
   {continue;}

   else
   {
    resultString[lvl] = theString[i];
    counters[i]--;
    solvePermutations(counters, lvl+1);
    counters[i]++;
   }
  }
}

int main()
{
    int *ptr;
    ptr = counters;

    solvePermutations(ptr, 0);
    return 0;
}

当我运行代码时,我得到的是输出而不是我期望的(12种不同的排列): ACAB ACBA BAAA BAAC BACA 等等 超过12而且没有逻辑(对我来说:D)

请帮我纠正一下,告诉我算法有什么问题并帮助我理解。谢谢。

1 个答案:

答案 0 :(得分:1)

您的算法中有一个小的逻辑错误。您使用的是counter[3]theString[4]。这里的想法是每个计数器的索引应对应一个字母,并保留所用字母的数量。

使用你的循环,你正在使用i<4。当i在该循环中为3时,您正在尝试访问超出范围的counter[3]。这是未定义的行为,您可以读取任何int值。

要更正此问题,您只需缩小循环即可转到最大值2(i < 3)并将theString更改为包含3个元素的数组{'A', 'B', 'C'}

char theString[3] = {'A','B','C'};

//...

for(int i=0; i<3; i++)