#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结束递归