C++;具有输出长度限制和特殊参数的置换 我是C++新手,我正在编写一个程序,它将生成字符串的所有排列列表,但是我需要限制输出的长度,以让我们说出5个字符(这很可能是由用户设置的变量数)。我已经为类似的东西搜索了大约一周,我得到的最接近的代码是下面的代码 Source.cpp: #包括; 使用名称空间std; 无效交换(字符*fir,字符*秒) { 字符温度=*fir; *fir=*秒; *秒=温度; } /*arr是字符串,curr是开始排列的当前索引,size是arr的大小*/ 无效置换(字符*arr、整数当前、整数大小) { 如果(当前==尺寸-1) { 对于(inta=0;a

C++;具有输出长度限制和特殊参数的置换 我是C++新手,我正在编写一个程序,它将生成字符串的所有排列列表,但是我需要限制输出的长度,以让我们说出5个字符(这很可能是由用户设置的变量数)。我已经为类似的东西搜索了大约一周,我得到的最接近的代码是下面的代码 Source.cpp: #包括; 使用名称空间std; 无效交换(字符*fir,字符*秒) { 字符温度=*fir; *fir=*秒; *秒=温度; } /*arr是字符串,curr是开始排列的当前索引,size是arr的大小*/ 无效置换(字符*arr、整数当前、整数大小) { 如果(当前==尺寸-1) { 对于(inta=0;a,c++,recursion,permutation,C++,Recursion,Permutation,这实际上不是一项困难的工作。如果可以在该函数中使用递归和循环,则可以解决它。我建议使用标准库中的函数 事实是时间。在3秒钟内,您可以只处理8个字符的排列。条件将取决于要求。假设在您的示例中,如果需要在开始或结束时省略连字符,您可以将其修剪回去 我的实现的伪代码: char array[] = "abcdee"; char eachPerm[6]; bool usedmatrix[6][6]; Recur(int depth, int n) {

这实际上不是一项困难的工作。如果可以在该函数中使用递归和循环,则可以解决它。我建议使用标准库中的函数

事实是时间。在3秒钟内,您可以只处理8个字符的排列。条件将取决于要求。假设在您的示例中,如果需要在开始或结束时省略连字符,您可以将其修剪回去

我的实现的伪代码:

    char array[] = "abcdee";
    char eachPerm[6];
    bool usedmatrix[6][6];
    Recur(int depth, int n)
    {
       // you can return from here if this is not the right path, suppose '-'
       // in first or last place.
       if(depth == n)
       {
          print;
       }
       else
       {
          int i;
          for(i= 0 to array.length)
          {
               if(array[i] is not used before)
               eachPerm[depth] = array[i];
               recur(depth+1, n);
          }
       }
    }

最初调用此函数
recur(0,5)

您需要限制递归的深度

给出字符串中字符的排列,每个字符只使用一次:

void permutation(char * arr, int currsize, intchar* sizeresult, int depth, int limit)
{
  if(depth == limit)
  {
    for(int a=0; a<limit; a++)
        cout << arr[a]result[a] << "";
    cout << endl;
  }
  else
  {
    for(int i=curr;i=0; i<size; i++)
    {
        swap(&arr[curr],result[depth] &arr[i]);= arr[i];
        permutation(arr, curr+1size, sizeresult, depth + 1, limit);
        swap(&arr[curr], &arr[i]);
    }
  }
}
为字符串中的字符提供排列,每个字符的使用次数不限:

void permutation(char * arr, int size, char* result, int depth, int limit)
{
  if(depth == limit)
  {
    for(int a=0; a<limit; a++)
        cout << result[a] << "";
    cout << endl;
  }
  else
  {
    for(int i=0; i<size; i++)
    {
        result[depth] = arr[i];
        permutation(arr, size, result, depth + 1, limit);
    }
  }
}

没有必要实现您自己的
交换
功能,因为中有一个。至于您的问题,您只想输出字符串中的前五个字符,还是第一个排列?这可能是您想要做的事情,更新后可以做您真正想做的事情,而不必输入多个字符。谢谢em在某种程度上起作用,但我之前担心的似乎是真的。这不允许一个字符在字符串中出现多次。例如:aaaaa,aaaab它们也将是我所寻找的有效输出,并且到目前为止,我的代码不会在字符串中多次列出这些字符。我可能已经在不修改代码的情况下修复了它。这可能是非常规的,但如果我在初始数组中添加可能的字符5次,它似乎会像它应该的那样打印。如果有更好的方法,请让我知道。非常感谢。它像一个符咒一样工作。我将在下面发布工作代码,以防其他人需要它。
void permutation(char * arr, int currsize, intchar* sizeresult, int depth, int limit)
{
  if(depth == limit)
  {
    for(int a=0; a<limit; a++)
        cout << arr[a]result[a] << "";
    cout << endl;
  }
  else
  {
    for(int i=curr;i=0; i<size; i++)
    {
        swap(&arr[curr],result[depth] &arr[i]);= arr[i];
        permutation(arr, curr+1size, sizeresult, depth + 1, limit);
        swap(&arr[curr], &arr[i]);
    }
  }
}
permutation(str, 0, sizeof(str)-1, result, 0, 5);
void permutation(char * arr, int size, char* result, int depth, int limit)
{
  if(depth == limit)
  {
    for(int a=0; a<limit; a++)
        cout << result[a] << "";
    cout << endl;
  }
  else
  {
    for(int i=0; i<size; i++)
    {
        result[depth] = arr[i];
        permutation(arr, size, result, depth + 1, limit);
    }
  }
}
  char result[5];
  permutation(str, sizeof(str)-1, result, 0, sizeof(result));