这道题跟之前写的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 协议 ,转载请注明出处!

51nod 1073 约瑟夫环 Previous
51nod 1058 1130 N的阶乘的长度及斯特林近似 Next