|
@@ -1,11 +1,13 @@
|
|
|
#include <algorithm>
|
|
|
+#include <iostream>
|
|
|
#include <vector>
|
|
|
|
|
|
#include "function.h"
|
|
|
|
|
|
-using namespace std;
|
|
|
+using std::vector; using std::swap; using std::ostream;
|
|
|
|
|
|
-bool isswap(vector<int> &arr, size_t beg, size_t end) {
|
|
|
+// 检查beg与end之间有无重复值
|
|
|
+bool isdiff(vector<int> &arr, size_t beg, size_t end) {
|
|
|
for (size_t i = beg; i < end; ++i) {
|
|
|
if (arr[i] == arr[end])
|
|
|
return false;
|
|
@@ -13,16 +15,31 @@ bool isswap(vector<int> &arr, size_t beg, size_t end) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-void permutation(vector<int> &arr, size_t pos, size_t len, vector<vector<int>> &res){
|
|
|
+// 递归求全排列并存入vector<vector<int>>中
|
|
|
+void perm_r(vector<int> &arr, size_t pos, size_t len, vector<vector<int>> &res){
|
|
|
if (pos == len) {
|
|
|
res.push_back(arr);
|
|
|
return;
|
|
|
}
|
|
|
for (size_t i = pos; i <= len; ++i) {
|
|
|
- if (isswap(arr, pos, i) == true) {
|
|
|
+ if (isdiff(arr, pos, i) == true) {
|
|
|
swap(arr[pos], arr[i]);
|
|
|
- permutation(arr. pos + 1, len, res);
|
|
|
+ perm_r(arr, pos + 1, len, res);
|
|
|
swap(arr[pos], arr[i]);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+// 简化入口
|
|
|
+void permutation(vector<int> &arr, vector<vector<int>> &res) {
|
|
|
+ perm_r(arr, 0, arr.size() - 1, res);
|
|
|
+}
|
|
|
+
|
|
|
+// 打印vector<int>
|
|
|
+ostream &print_arr(const vector<int> &vec, ostream &os) {
|
|
|
+ os << "[";
|
|
|
+ for (const int &n : vec)
|
|
|
+ os << " " << n;
|
|
|
+ os << " ]";
|
|
|
+ return os;
|
|
|
+};
|