对于dfs算法我们可以进行许多操作,最重要的就是了解回溯哪一个步骤是啥。好,现在我就快速的进入今天所要书写的内容,假如给你几个数要我们实现全排列。我们第一反应就是使用dfs回溯算法
#include <bits/stdc++.h>
#define int long long
using namespace std;
void dfs(vector<int>& arr, int cnt, vector<vector<int> >& result) {
if (cnt == arr.size()) {
result.push_back(arr);
return;
}
for (int i = cnt; i < arr.size(); i++) {
swap(arr[cnt], arr[i]);
dfs(arr, cnt + 1, result);
swap(arr[cnt], arr[i]);
}
}
signed main() {
int arr[] = {1, 2, 3};
vector<int> vec(arr, arr + sizeof(arr) / sizeof(arr[0]));
vector<vector<int> > result;
dfs(vec, 0, result);
for (size_t i = 0; i < result.size(); i++) {
for (size_t j = 0; j < result[i].size(); j++) {
cout << result[i][j] << " ";
}
cout << endl;
}
return 0;
}
这是常见的dfs进行全排列的一个小小的例子,其中那个arr数组里面的数可以进行改变或者别样的操作相信读者应该能看得懂代码。
下面进入本章的主角next_permutation,这是一个stl库中一个实现全排列的方法,这个的语法可以就是next_permutation(开始,结束);这样就可以搭配各种语句来实现全排列了!
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
int arr[] = {1, 2, 3};
vector<int> vec(arr, arr + sizeof(arr) / sizeof(arr[0]));
sort(vec.begin(), vec.end());
do {
for (size_t i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;
} while (next_permutation(vec.begin(), vec.end()));
return 0;
}
这两个代码得出的结果都是
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
OK这章介绍next_permutation就到此结束了