c++使用递归实现带重复的全排列问题。
时间: 2024-12-02 14:20:22 浏览: 28
在C++中,递归可以有效地解决全排列问题,特别是当涉及到有重复元素的情况时,可以借助回溯法(Backtracking)来处理。这里有一个简单的例子,我们将通过递归来生成所有包含重复元素的全排列:
```cpp
#include <iostream>
#include <vector>
void permuteUnique(std::vector<int>& nums, std::vector<int>& path, int index) {
if (index == nums.size()) { // 当前路径已经完成,添加到结果中
std::vector<int> result(path.begin(), path.end());
std::sort(result.begin(), result.end()); // 对结果排序去重
std::cout << "[ " << result[0] << ", ..., " << result[result.size() - 1] << " ]\n";
} else {
for (int i = 0; i < nums.size(); ++i) { // 选择当前未添加的数
if (i != index && nums[i] == nums[index]) continue; // 跳过相同的数字
path[index] = nums[i]; // 将当前数添加到路径上
permuteUnique(nums, path, index + 1); // 继续递归下一层
path[index] = 0; // 回溯,移除添加的数
}
}
}
int main() {
std::vector<int> nums = {1, 1, 2}; // 示例输入:有重复的1和2
std::vector<int> path(nums.size(), 0);
permuteUnique(nums, path, 0);
return 0;
}
```
在这个示例中,`permuteUnique`函数接受一个整数数组`nums`和一个临时存储当前路径的数组`path`。递归的核心在于检查是否到达了结束位置(`index == nums.size()`),如果是,则生成一个新的排列并去重。如果不是,遍历数组中的每个元素,跳过重复的,并尝试将当前元素添加到路径中,然后继续递归。
注意,每次递归返回之前,我们都需要将`path[index]`置零来撤销上一次的选择,这叫做回溯操作。运行这个程序,你会看到包含重复元素的不同排列组合。
阅读全文