在C++中寻找排列和组合

Finding permutation and combination in C++

本文关键字:组合 排列 寻找 C++      更新时间:2023-10-16

我想在C++中找到一系列动态长度的数字。假设我有 2 组数字:arr1[3] = {1, 3, 8}arr2[4] = {2, 9},那么预期的输出是:

'1, 2',
'1, 9',
'3, 2',
'3, 9',
'8, 2',
'8, 9'.

但是,如果现在有 3 个组:arr1[3] = {1, 3, 8}arr2[2] = {2, 9}arr3[5] = {1, 3, 9},则输出应该是:

'1, 2, 1',
'1, 2, 3',
'1, 2, 9',
'1, 9, 1',
'1, 9, 3',
'1, 9, 9',
'3, 2, 1',
'3, 2, 3',
'3, 2, 9',
'3, 9, 1',
'3, 9, 3',
'3, 9, 9',

等等...

所以会有 3 x 2 x 3 = 18 个结果。我使用各自数量的 for 循环获得了 2 组和 3 组的结果。

请参阅2组的此代码:

for(int i=1;i<=5;i++) { 
for (int j=1;j<=5;j++) { 
cout << i << "," << j << "," << endl; 
} 
}

但是,我必须对组号的不同值使用不同的代码,并且必须使用switch语句或if-else语句来选择该部分代码。

这将是一个很大的帮助。提前感谢!

我使用了向量而不是数组,因为它们更容易处理。

诀窍是按字典顺序枚举数组中的位置,然后在这些位置显示值:

#include <vector>
#include <iostream>
using std::vector;
void permutate(vector<vector<int>> values)
{
// the positions in each vector
vector<size_t> pos(values.size());
do
{
// display one of each array at current position
for(size_t i = 0; i < values.size(); ++i)
{
std::cout << values[i][pos[i]] << ", ";
}
std::cout << std::endl;
// increment the last array's display position
size_t p = 0;
pos[p]++;
// while we get to the end of current array, return to 0 and carry to next position
while(pos[p] == values[p].size())
{
pos[p] = 0;
p++;
pos[p]++;
// return when the last array's position get to its size
if (p == values.size())
{
return;
}
}
}
while(true);
}
int main()
{
vector<int> arr1 = {1, 3, 8};
vector<int> arr2 = {2, 9};
vector<int> arr3 = {1, 3, 9};
vector<vector<int>> allThree = {arr1, arr2, arr3};
permutate(allThree);
}

接下来,一个很好的练习是将其模板化,以便您接受std::vector<std::vector<T>>