C++递归实现带重复的全排列问题。例如:输入{1,3,1}; 输出:{1,3,1},{1,1,3},{3,1,1}。
时间: 2024-12-10 15:52:14 浏览: 14
在C++中,递归是一种常见的算法实现方式,可以用来生成所有包含重复元素的全排列。对于给定的问题,我们可以创建一个函数,该函数接受一个整数数组和当前排列的索引作为参数。下面是一个简单的示例:
```cpp
#include <iostream>
#include <vector>
std::vector<int> permuteWithDuplicates(std::vector<int>& nums, int start) {
std::vector<int> result;
if (start == nums.size()) { // 当前排列完成,加入结果
result.push_back(nums);
} else {
for (int i = start; i < nums.size(); ++i) { // 遍历未使用的元素
if (i > start && nums[i] == nums[i - 1]) continue; // 跳过重复元素
nums[start] ^= nums[i]; // 交换当前元素和起始位置的元素
permuteWithDuplicates(nums, start + 1); // 递归调用处理剩余元素
nums[start] ^= nums[i]; // 撤销交换,回溯到上一步
// 如果元素已经在其他位置使用过了,不需要再尝试
if (i < nums.size() - 1 && nums[i] == nums[i + 1]) continue;
}
}
return result;
}
// 测试函数
int main() {
std::vector<int> nums = {1, 3, 1};
std::vector<std::vector<int>> permutations = permuteWithDuplicates(nums, 0);
for (const auto& permutation : permutations) {
for (int num : permutation)
std::cout << num << " ";
std::cout << "\n";
}
return 0;
}
```
这个程序会生成所有可能的排列,并打印出来。注意,由于递归过程中需要回溯,所以对于大的输入集合,可能会导致栈溢出。此外,在实际应用中,你可以选择存储中间结果,而不是每次生成一个新的数组。
阅读全文