给出 n 互不相同的数,输出它们的 n!个排列。按字典序从小到大输出这组数的全排列。两个排列在字典序的大小关系指,从第一个位置开始比较,遇到的第一个不相同的数时,较小的那个所在的排列字典序更小。时间限制为一秒。使用回溯的方法,c++代码生成。
时间: 2024-02-20 13:00:47 浏览: 49
回溯法 - 输出自然数1到n所有不重复的排列,即n的全排列
以下是使用 C++ 实现回溯法生成全排列的代码:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void backtrack(vector<int>& arr, int n, int start, vector<vector<int>>& res) {
if (start == n) {
res.push_back(arr); // 将当前排列添加到结果中
} else {
for (int i = start; i < n; i++) {
swap(arr[start], arr[i]); // 交换第 start 个位置和第 i 个位置的数
backtrack(arr, n, start+1, res); // 递归生成后面的排列
swap(arr[start], arr[i]); // 回溯到上一层递归,交换回来
}
}
}
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
vector<vector<int>> res;
backtrack(arr, n, 0, res);
sort(res.begin(), res.end()); // 按字典序从小到大排序
for (auto& perm : res) {
for (int num : perm) {
cout << num << ' ';
}
cout << endl;
}
return 0;
}
```
这样就可以在一秒内生成 n 个数的 n! 个排列,并按字典序从小到大输出。
阅读全文