给出 n 个数的有重集合(可以有重复的数),求所有排列,按字典树输出.第一行集合元素个数 1 ≤ n ≤ 8,第二行 n 个空格隔开的正整数 1 ≤ ai ≤ 100.按字典序输出所有排列.使用回溯方法,用c++代码实现,时间限制为一秒。
时间: 2024-03-01 08:54:31 浏览: 110
输出n个数字的全排列(可重复)
4星 · 用户满意度95%
好的,以下是使用回溯法实现求解全排列的 C++ 代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void backtrack(vector<int>& nums, vector<vector<int>>& res, int first, int n) {
if (first == n) { // 找到一个排列
res.push_back(nums);
return;
}
for (int i = first; i < n; ++i) {
if (i != first && nums[i] == nums[first]) { // 去重
continue;
}
swap(nums[i], nums[first]); // 交换
backtrack(nums, res, first + 1, n); // 递归求解
}
for (int i = first + 1; i < n; ++i) { // 恢复状态
swap(nums[i], nums[first]);
}
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; ++i) {
cin >> nums[i];
}
sort(nums.begin(), nums.end()); // 排序
vector<vector<int>> res;
backtrack(nums, res, 0, n);
for (auto& p : res) {
for (auto& x : p) {
cout << x << " ";
}
cout << endl;
}
return 0;
}
```
时间复杂度为 O(n*n!),可以通过此题。
阅读全文