51nod 1384
给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = “1312”,
输出为:1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211
参阅网上资料,只有用dfs和next_permutation(s,s+n)函数两种方法。因为本人能力有限,只好都拿来借鉴(chaoxi)一下
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char s[50],ans[50];
bool v[50];
int n;
void dfs(int cnt)
{
if(cnt==n)
{
cout<<ans<<endl;
return ;
}
for(int i=0;i<n;++i)
{
if(!v[i])
{
v[i]=1;
ans[cnt]=s[i];
dfs(cnt+1);
v[i]=0;
while(i<n&&s[i]==s[i+1]) ++i;
}
}
}
int main() {
cin>>s;
n=strlen(s);
sort(s,s+n);
dfs(0);
return 0;
}
next_permutation(s,s+n)对s到s+n位置的元素进行排列,他是把当前元素按照升序一个大小来排列。并且返回是否排列成功,而且修改了s的本地内容。每次都把当前的s变大一下。(总结的不是很好,并且发现表达的不清楚,具体按照代码来理解吧),似乎根据参数来看。只能是连续的内容进行排序。
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main() {
char s[50];
int n;
cin>>s;
n=strlen(s);
sort(s,s+n);
do{
cout<<s<<endl;
}while(next_permutation(s,s+n));
return 0;
}