我在 c++ 中有两个 n ,我想以这样的方式生成这些向量中数字的排列,以便为第一个向量的每个排列我拥有所有其他向量的所有排列。假设我有两个数字为 2 9 的向量,另一个向量是 5 6。那么我的结果应该是......
- 2 9 5 6
- 2 9 6 5
- 9 2 5 6
- 9 2 6 5
意味着我得到的排列总数将是总 perms =(第一个向量的排列数乘以第二个向量的排列数乘以第三个向量的排列数,依此类推)。
我已经编写了下面的代码,并且我被递归堆栈所吸引......对于每个大小为 2 个的 2 个向量的情况,它实际上打印了 6 次。
mySwap(int *x, int *y){
int temp;
temp = *x;
*x = *y;
*y = temp;
}
交换两个 int 元素
void myPerm(vector<vector<int>> myItems, int start, int end,int vectorIndex){
int j;
if(start == end){
for(int k = vectorIndex +1; k < items.size(); ++k){
myPerm(myItems, 0, myItems[k].size()-1,k);
}
for(int z = 0; z < myItems.size(); ++z){
for(int l = 0; l < myItems[z].size(); ++z){
std::cout << myItems[z][l];
}
}
}
else{
for(int j = start; j <= end; j++){
mySwap(&myItems[vectorIndex][start],&myItems[vectorIndex][j]);
myPerm(myItems,start + 1, end,vectorIndex);
mySwap(&myItems[vectorIndex][start],&myItems[vectorIndex][j]);
}
}
}
上面递归生成排列的代码......
int main(){
vector<vector<int>> myItems;
int k = 0;
for(int i =0; i < 2; ++i){
myItems.push_back(vector<int>);
}
for(int j =0; j < 2; ++j){
myItems[i].push_back(k++);
}
myPerm(items,0,items[0].size()-1,0);
return;
}
我的主要功能。
请给我一些提示或针对一般情况解决这个问题,因为上面的代码打印了六个原本应该是 4 次的排列。
谢谢