这道题跟之前写的dfs不同的一点是可以有重复的字母,想了一下dfs改不了,所以只能利用set容器了,set容器有唯一性,而且已经从小到大排列好了,还不用sort了。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<set>
#include<string>
#include<iostream>
using namespace std;
char s[10],as[10];
int vis[10]={0};
int len;
set<string>qpl;
void pl(int x)
{
int i,j;
if(x==len)qpl.insert(as);
else
{
for(i=0;i<len;i++)
{
if(vis[i]==0)
{
as[x]=s[i];
vis[i]=1;
pl(x+1);
vis[i]=0;
}
}
}
}
int main()
{
gets(s);
len=strlen(s);
sort(s,s+len);
pl(0);
for(set<string>::iterator it=qpl.begin();it!=qpl.end();it++)
cout<<*it<<endl;
return 0;
}
另外也可以利用STL中的库函数next_permutation:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<set>
#include<string>
#include<iostream>
using namespace std;
char s[10];
int main()
{
int len;
gets(s);
len=strlen(s);
int l=strlen(s);
sort(s,s+l);
do
{
puts(s);
}while(next_permutation(s,s+l));
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!