#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
sort(s.begin(), s.end());
do {
cout << s << endl;
} while (next_permutation(s.begin(), s.end()));
cout << endl;
sort(s.begin(), s.end(),greater<char>());
do {
cout << s << endl;
} while (prev_permutation(s.begin(), s.end()));
return 0;
}
简单明了,全靠 next/prev_permutation 函数,这是一个非常好用的排序函数,但无法进行剪枝的操作,即在明知当前排列已经错误时无法停止,会导致超时。
这是就需要我们手写一个排列函数
#include<bits/stdc++.h>
using namespace std;
vector<int> a={1,2,3,4,5,6,7,8,9,10};
bool vis[20];
int b[20];
void dfs(int s,int t,vector<int>&a2){
if(s == t){
for(int i = 0; i < t; ++i) cout << b[i] << " ";
cout << endl;
return;
}
//剪枝操作
for(int i = 0; i < t; i++){
if(!vis[i]){
vis[i] = true;
b[s] = a2[i];
dfs(s + 1,t,a2);
vis[i] = false;
}
}
return;
}
int main(){
int start,end;
cin>>start>>end;
vector<int> a2(a.begin() + start - 1, a.begin() + end);
dfs(0,end-start+1,a2);
return 0;
}
这里没有具体的例子大致是满足一个具体的条件后return结束递归