51nod
題目鏈接
考慮把每個數字放在哪一位上,不能保證是字典序的,所以用vector存儲後,再排序一遍。
版本1
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
string s, res;
vector<string> v;
bool vis[12];
int n;
void dfs(int u, int st){
if(u == n){
v.push_back(res);
return;
}
for(int j = st; j < n; j++){
if(vis[j]) continue;
vis[j] = true;
res[j] = s[u]; //把數字1放在數組中的什麼位置
if(u + 1 < n && s[u + 1] == s[u]) dfs(u+1, j + 1); //如果下一個數是重複數,則放在該數的後面
else dfs(u+1, 0);
vis[j] = false;
}
}
int main(){
cin >> s;
n = s.size();
res.resize(n);
sort(s.begin(), s.end());
dfs(0, 0);
sort(v.begin(), v.end());
for(auto x: v){
cout<<x<<endl;
}
return 0;
}
版本2
直接用C++中的庫函數
#include<iostream>
#include<algorithm>
#include<string>
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()));
return 0;
}