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