给出 n 个数的有重集合(可以有重复的数),求所有排列,按字典树输出.使用c++语言实现。
时间: 2024-02-24 16:57:59 浏览: 60
以下是使用 C++ 实现的代码:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void backtrack(vector<int>& nums, vector<int>& record, vector<bool>& used, int count) {
if (count == nums.size()) {
// 找到一种排列,输出
for (int i = 0; i < nums.size(); i++) {
cout << record[i] << " ";
}
cout << endl;
return;
}
for (int i = 0; i < nums.size(); i++) {
if (!used[i]) {
if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {
// 如果当前数和前一个数相同,并且前一个数还没有被选择过,就可以跳过当前数
continue;
}
record[count] = nums[i];
used[i] = true;
backtrack(nums, record, used, count + 1);
used[i] = false;
}
}
}
void permute(vector<int>& nums) {
sort(nums.begin(), nums.end()); // 对集合进行排序
vector<int> record(nums.size(), 0); // 记录当前已经选择的数
vector<bool> used(nums.size(), false); // 记录当前数是否已经被选择过
backtrack(nums, record, used, 0);
}
int main() {
vector<int> nums = {2, 2, 1, 1};
permute(nums);
return 0;
}
```
该代码使用了与 Python 版本类似的回溯算法,具体实现细节可以参考上文 Python 代码的解释。需要注意的是,在 C++ 版本中需要使用 vector 容器来保存集合和记录当前已经选择的数,而不能使用数组。
阅读全文